【问题标题】:How to get an instance of unitycontainer?如何获取unitycontainer的实例?
【发布时间】:2012-01-30 19:51:12
【问题描述】:

我正在开发一个 Silverlight 应用程序,并在其中引入了Unity

我的问题是我不知道如何获取容器实例。

我在AppApplicationStartup 方法中创建了这个实例

_container = new UnityContainer();
            _container.RegisterType<IMyAppServiceAgent, MyAppServiceAgent>(new InjectionConstructor(OriginalHandlerId, W2OGuid, ServiceEndpointAddr));

我写了一个吸气剂

public IUnityContainer Container
        {
            get { return _container; }
        }

一切正常,这就是我使用容器的方式:

    public static void CreateMemberSearch()
    {
        if (_memberSearch == null)
        {

            _memberSearch =
                new MemberSearchViewModel((App.Current as App).Container.Resolve<IMyAppServiceAgent>());

        }
    }

以上示例来自 ViewModelLocator(来自 MVVM Light Toolkit)。

我需要知道如何重构我的代码以符合 IOC 原则。

【问题讨论】:

    标签: silverlight mvvm inversion-of-control unity-container


    【解决方案1】:

    上面显示的代码实现了ServiceLocator anti-pattern。你不应该直接调用容器。

    容器在Composition Root 中设置。对于将成为您的 ApplicationStartup 方法或专用引导程序的 Silverlight 应用程序,例如 Caliburn.Micro

    这个容器实例只被调用一次来解析你的主视图或视图模型(取决于你是使用视图优先还是视图模型优先方法)。

    应该就是这样。你永远不应该再次调用你的容器。如果一个类依赖于其他组件:使用constructor injection 注入该组件。如果该类需要创建其他对象:注入工厂。 Unity 有一个很好的功能,叫做automatic factories


    更新

    如果ViewModelLocator 是您的基础架构的一部分,并且您从不直接在应用程序代码中使用它……也许。请参阅我对@MikePost 问题的评论。

    【讨论】:

    • 感谢您的回复塞巴斯蒂安。因此,如果我将 IUnityContainer 添加到 ViemModelLocator 构造函数中,它可以接受吗?
    • 问塞巴斯蒂安的问题。我使用 container.Resolve() 来创建我的对象的实例(例如在延迟加载时)。你是说不应该这样做吗?
    • 有趣,尤其是反模式链接。但是,您如何解决视图-模型-定位器模式使用静态网关到 DI 容器解决的问题?
    • @MikePost 我不熟悉 MVVM Light,但其他框架(如 Caliburn.Micro)通过使定位器成为基础架构的一部分来“解决”该问题。它仍然是相同的模式,但您的应用程序代码从不直接调用容器。框架/基础设施确实如此。我知道这听起来更像是合法的废话,但它确实有很大的不同,它是将您的应用程序保持在一起并与您的 DI 容器互操作的粘合剂,或者如果您的应用程序代码在那里并且只是从所述容器中提取它认为可能需要的任何内容。
    • @Anton 如果你想使用延迟加载,请注入一个工厂。 Unity 可以即时生成工厂。例如。如果您需要IService,请不要将其从容器中拉出,而是添加Func&lt;IService&gt; 类型的ctor 参数。如果您告诉 Unity(和其他几个容器)应该将 IService 映射到哪个实现,Unity(和其他几个容器)知道如何为您生成委托。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2012-10-11
    相关资源
    最近更新 更多