【问题标题】:Using Microsoft Unity 2.0 framework with a web application将 Microsoft Unity 2.0 框架与 Web 应用程序一起使用
【发布时间】:2012-02-23 15:13:04
【问题描述】:

当在 Web 应用程序中使用 Unity 2.0 进行依赖注入时,用户控件、页面等似乎都需要进行显式调用来检索容器并“获取”依赖项……所以使用像 [dependency] 这样的注解赢了不提供任何价值。这可能是因为容器的位置(应用程序上下文、http 上下文缓存等)在 Web 配置中是未知的。

既然 Unity 本身提供了方法拦截,那么当你构建自己的 web 应用程序时,难道没有办法“告诉”unity 如何正确获取容器吗?而不必为页面等创建基类?

【问题讨论】:

    标签: asp.net dependency-injection unity-container


    【解决方案1】:

    问题在于 WebForms 页面和控件未设置为允许通过依赖注入进行构造,因此除非类调用 Unity 本身,否则根本不会调用 Unity。我发现在这些情况下最好的模式是通过服务定位器在构造函数中调用 DI 框架,然后使用注释来标记依赖属性。像这样的:

    public MyPage()
    {
        // Injector is a wrapper class so you can change the underlying DI framework
        // later if necessary.
        Injector.Inject(this); 
    }
    
    [Dependency]
    public SomeService MyService {get;set;}
    

    【讨论】:

    • 不能使用拦截器来做同样的事情而不需要修改所有的控件和页面吗?
    • @BrianBeckham:不。你会拦截什么方法?拦截器仅适用于您的 DI 框架首先创建的对象。由于 WebForms 不提供任何钩子,因此您一开始就无法涉足。
    • 我希望 Unity 本身内部的某些东西可以被截获,但看起来好像不是问题....不如在 asp.net 管道中创建一些东西呢?
    • @BrianBeckham:如果 Unity 从一开始就没有被调用,那么就没有什么可以拦截的了。并且 WebForms 不会为您提供在创建新控件或页面时调用 Unity 所需的钩子。 MVC 在这类事情上要好得多,因为它可以让你告诉它在需要构建控制器时使用什么工厂实现。
    • @BrianBeckham:HttpModule 是一种有趣的方法,在某些情况下可能会起作用。请记住,它在 OnPageInitComplete 事件之前不会生效,这意味着如果您需要在任何控件的 Init 阶段使用任何依赖项,那么您就不走运了。
    猜你喜欢
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    相关资源
    最近更新 更多