Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection Unity:如何跨UnityContainer类的实例确保有状态类的单例实例?_Dependency Injection_Unity Container_Ioc Container - Fatal编程技术网

Dependency injection Unity:如何跨UnityContainer类的实例确保有状态类的单例实例?

Dependency injection Unity:如何跨UnityContainer类的实例确保有状态类的单例实例?,dependency-injection,unity-container,ioc-container,Dependency Injection,Unity Container,Ioc Container,我正在处理的应用程序要求动态创建对象,其中一些还使用单例实例(当然,基于生命周期管理器),因为涉及到状态(想想WCF服务会话等等) 只要我通过UnityContainer类的同一个实例进行解析,一切都很好,但我认为蛇在咬自己的尾巴: a) 每个人都讨厌提供UnityContainer类的单个实例这一最直观的想法 b) 同时,这似乎是唯一合乎逻辑的解决方案 我的意思是,说真的,如果对ServiceLocator模式有这么多仇恨,那么你还有什么建议 编辑: 好的,我找到了一个很好的解决方案。Unit

我正在处理的应用程序要求动态创建对象,其中一些还使用单例实例(当然,基于生命周期管理器),因为涉及到状态(想想WCF服务会话等等)

只要我通过UnityContainer类的同一个实例进行解析,一切都很好,但我认为蛇在咬自己的尾巴:

a) 每个人都讨厌提供UnityContainer类的单个实例这一最直观的想法

b) 同时,这似乎是唯一合乎逻辑的解决方案

我的意思是,说真的,如果对ServiceLocator模式有这么多仇恨,那么你还有什么建议

编辑:

好的,我找到了一个很好的解决方案。UnityContainer类可以将自身作为单例注入。下面是一个例子(它是用一种非常难看的风格写的,但它证明了我的观点):

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);
// ..