如何访问 class 库 ActionFilterAttribute 中的 Unity 容器?
How can get access to Unity container in a class library ActionFilterAttribute?
所以,我有一个 Web 项目,它利用 Unity 为接口 IUserRepository
注入 UserRepository
。我有一个 class 库,其中包含自定义 ActionFilterAttribute
。此自定义属性 class 已用于许多操作。我想向其中添加一些代码以根据用户检查数据库中的值。为此,我需要访问 UserRepository
。我可以用老式的方式使用语句并直接访问 UserRepository
,但我想利用 DI 并解析 IUserRepository
。由于 ActionFilterAttribute
需要一个空的构造函数,我如何才能在自定义属性 class 中访问 Web 解析 IUserRepository
的内容?
属性是元数据对象。他们不应该参与数据库访问。使用单独的服务读取属性值并访问数据库。
因此,虽然我决定不在自定义属性内部进行用户检查,但允许在自定义属性内部注入的解决方案可以在其他地方使用。我在属性中有一个 属性:
public IUserRepository UserRepository { get; set; }
在网络的 Global.asax.cs 中,我通过 属性 注入:
container.RegisterType<NameOfCustomAttribute>(new InjectionProperty("UserRepository",
new UserRepository(ConfigurationManager.ConnectionStrings["DBName"].ConnectionString)));
这是一个老问题,但我发现您可以使用 actionContext
参数在 ActionFilterAttribute
中访问依赖项解析,如下所示:
MyFooService myFooService = actionContext.Request.GetDependencyScope().GetService(typeof(MyFooService)) as MyFooService;
所以,我有一个 Web 项目,它利用 Unity 为接口 IUserRepository
注入 UserRepository
。我有一个 class 库,其中包含自定义 ActionFilterAttribute
。此自定义属性 class 已用于许多操作。我想向其中添加一些代码以根据用户检查数据库中的值。为此,我需要访问 UserRepository
。我可以用老式的方式使用语句并直接访问 UserRepository
,但我想利用 DI 并解析 IUserRepository
。由于 ActionFilterAttribute
需要一个空的构造函数,我如何才能在自定义属性 class 中访问 Web 解析 IUserRepository
的内容?
属性是元数据对象。他们不应该参与数据库访问。使用单独的服务读取属性值并访问数据库。
因此,虽然我决定不在自定义属性内部进行用户检查,但允许在自定义属性内部注入的解决方案可以在其他地方使用。我在属性中有一个 属性:
public IUserRepository UserRepository { get; set; }
在网络的 Global.asax.cs 中,我通过 属性 注入:
container.RegisterType<NameOfCustomAttribute>(new InjectionProperty("UserRepository",
new UserRepository(ConfigurationManager.ConnectionStrings["DBName"].ConnectionString)));
这是一个老问题,但我发现您可以使用 actionContext
参数在 ActionFilterAttribute
中访问依赖项解析,如下所示:
MyFooService myFooService = actionContext.Request.GetDependencyScope().GetService(typeof(MyFooService)) as MyFooService;