【问题标题】:How can get access to Unity container in a class library ActionFilterAttribute?如何在类库 ActionFilterAttribute 中访问 Unity 容器?
【发布时间】:2015-07-08 23:08:43
【问题描述】:

所以,我有一个 Web 项目,它利用 Unity 为接口 IUserRepository 注入 UserRepository。我有一个包含自定义ActionFilterAttribute 的类库。此自定义属性类已用于许多操作。我想添加一些代码来根据用户检查数据库中的值。为此,我需要访问UserRepository。我可以使用老式的方式使用语句并直接访问UserRepository,但我想利用 DI 并解析IUserRepository。由于ActionFilterAttribute 需要一个空的构造函数,我如何才能在自定义属性类中访问网络正在解析IUserRepository 的内容?

【问题讨论】:

  • 一种方法 - eagle081183.wordpress.com/2010/09/21/… 。旁注:我相信您尝试做的事情是个坏主意,因为您将同步远程调用注入请求 - 个人喜好。
  • @AlexeiLevenkov 我同意。在与一些人交谈后,我们决定有一个更好的地方来做我的检查。我仍然会发布答案,因为该解决方案也可以在其他地方使用。

标签: c# dependency-injection unity-container class-library actionfilterattribute


【解决方案1】:

属性是元数据对象。他们不应该参与数据库访问。使用单独的服务来读取属性值并访问数据库。

【讨论】:

  • 虽然您的建议是“更好”的设计,但它实际上并没有回答我的问题。在我看来,这应该是对我的问题的评论。
【解决方案2】:

因此,尽管我决定不对自定义属性内部进行用户检查,但允许在自定义属性内部进行注入的解决方案可以在其他地方使用。我在属性中有一个属性:

public IUserRepository UserRepository { get; set; }

在 web 的 Global.asax.cs 中,我通过属性注入注入了它:

container.RegisterType<NameOfCustomAttribute>(new InjectionProperty("UserRepository", 
                                        new UserRepository(ConfigurationManager.ConnectionStrings["DBName"].ConnectionString)));

【讨论】:

【解决方案3】:

这是一个老问题,但我发现您可以使用actionContext 参数在ActionFilterAttribute 中访问您的依赖解析,如下所示:

MyFooService myFooService = actionContext.Request.GetDependencyScope().GetService(typeof(MyFooService)) as MyFooService;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-10
    • 2014-10-08
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多