我正在开发一个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
原则。
答案 0 :(得分:5)
上面显示的代码实现了ServiceLocator anti-pattern。你永远不应该直接调用容器。
容器在Composition Root中设置。对于Silverlight应用程序,它将是您的ApplicationStartup方法,或者是Caliburn.Micro中的专用引导程序。
此容器实例只调用一次以解析您的主视图或视图模型(取决于您首先使用视图还是首先使用viewmodel方法)。
那应该是它。你不应该再次打电话给你的容器。如果一个类依赖于某个其他组件:使用constructor injection注入该组件。如果该类需要创建其他对象:注入工厂。 Unity有一个很好的功能叫automatic factories
更新
如果ViewModelLocator
是您的基础架构的一部分,并且您从未直接在您的应用程序代码中使用它......也许。请参阅我对@ MikePost问题的评论。