Dependency injection Unity:如何跨UnityContainer类的实例确保有状态类的单例实例?
我正在处理的应用程序要求动态创建对象,其中一些还使用单例实例(当然,基于生命周期管理器),因为涉及到状态(想想WCF服务会话等等) 只要我通过UnityContainer类的同一个实例进行解析,一切都很好,但我认为蛇在咬自己的尾巴: a) 每个人都讨厌提供UnityContainer类的单个实例这一最直观的想法 b) 同时,这似乎是唯一合乎逻辑的解决方案 我的意思是,说真的,如果对ServiceLocator模式有这么多仇恨,那么你还有什么建议 编辑: 好的,我找到了一个很好的解决方案。UnityContainer类可以将自身作为单例注入。下面是一个例子(它是用一种非常难看的风格写的,但它证明了我的观点):Dependency injection Unity:如何跨UnityContainer类的实例确保有状态类的单例实例?,dependency-injection,unity-container,ioc-container,Dependency Injection,Unity Container,Ioc Container,我正在处理的应用程序要求动态创建对象,其中一些还使用单例实例(当然,基于生命周期管理器),因为涉及到状态(想想WCF服务会话等等) 只要我通过UnityContainer类的同一个实例进行解析,一切都很好,但我认为蛇在咬自己的尾巴: a) 每个人都讨厌提供UnityContainer类的单个实例这一最直观的想法 b) 同时,这似乎是唯一合乎逻辑的解决方案 我的意思是,说真的,如果对ServiceLocator模式有这么多仇恨,那么你还有什么建议 编辑: 好的,我找到了一个很好的解决方案。Unit
static void Main(字符串[]args)
{
var container=new UnityContainer().LoadConfiguration();
var test=container.Resolve();
test.TestTheDependency();
foreach(容器中的var注册。注册)
{
Console.WriteLine(registration.RegisteredType.Name);
}
var container2=container.Resolve();
Console.WriteLine(container.GetHashCode());
Console.WriteLine(container2.GetHashCode());
test.ShowUnityContainerHashCode();
var testD1=container.Resolve();
var testD2=container2.Resolve();
WriteLine(testD1.GetHashCode());
WriteLine(testD2.GetHashCode());
test.ShowTestDependencyHashCode();
}
显示相同哈希代码的2个块和3倍,如果
<register type="ITestDependency" mapTo="TestDependency">
<lifetime type="singleton"/>
</register>
<register type="MyDependant" />
在app.config中设置
非常好。我爱团结,说真的。这是一个热门话题。如果您确实必须在多个UnityContainer实例之间共享同一个实例,那么最好的解决方案可能是只解析一次,然后在所有其他UnityContainer实例中注册该实例:
var f = container1.Resolve<IFoo>();
// ..
container42.RegisterInstance<IFoo>(f);
// ..
var f=container1.Resolve();
// ..
集装箱42.登记站(f);
// ..
另一种选择是使实现成为真正的单例,但仍然在每个容器实例中注册实例。这使得它成为了一个实现细节,即存在一个单例,并且它消除了单例模式的许多缺点,因为消费者永远不会知道它
但是,最好的解决方案是只使用一个容器。尽管我能想到一些非常奇特的场景,其中任意数量的容器实例是合适的,但在绝大多数情况下,单个容器实例是正确的配置
var f = container1.Resolve<IFoo>();
// ..
container42.RegisterInstance<IFoo>(f);
// ..