如何获得unitycontainer的实例?

时间:2012-01-30 19:51:12

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

我正在开发一个Silverlight应用程序,并且已经将Unity引入其中。

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

我在ApplicationStartup

App方法中创建此内容
_container = new UnityContainer();
            _container.RegisterType<IMyAppServiceAgent, MyAppServiceAgent>(new InjectionConstructor(OriginalHandlerId, W2OGuid, ServiceEndpointAddr));

我写了一个getter

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原则。

1 个答案:

答案 0 :(得分:5)

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

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

此容器实例只调用一次以解析您的主视图或视图模型(取决于您首先使用视图还是首先使用viewmodel方法)。

那应该是它。你不应该再次打电话给你的容器。如果一个类依赖于某个其他组件:使用constructor injection注入该组件。如果该类需要创建其他对象:注入工厂。 Unity有一个很好的功能叫automatic factories


更新

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