我正在处理的应用程序需要动态创建对象,其中一些还使用单例实例(当然是基于生命周期管理器),因为涉及到状态(想想WCF服务会话等...... )。
只要我通过UnityContainer类的相同实例解析,一切都很好,但我想在这里蛇正在咬它自己的尾巴:
a)每个人都讨厌提供UnityContainer的单个实例的最直观的想法 -
b)同时这似乎是唯一合乎逻辑的解决方案
我的意思是,严肃地说,如果对ServiceLocator模式有如此多的仇恨,那你还有什么建议?
编辑:
好的,我找到了一个非常好的解决方案。 UnityContainer - 类可以将自身注入单例。这是一个例子(它以非常丑陋的方式编写,但它证明了我的观点):
static void Main(string[] args)
{
var container = new UnityContainer().LoadConfiguration();
var test = container.Resolve<MyDependant>();
test.TestTheDependency();
foreach (var registration in container.Registrations)
{
Console.WriteLine(registration.RegisteredType.Name);
}
var container2 = container.Resolve<IUnityContainer>();
Console.WriteLine(container.GetHashCode());
Console.WriteLine(container2.GetHashCode());
test.ShowUnityContainerHashCode();
var testD1 = container.Resolve<ITestDependency>();
var testD2 = container2.Resolve<ITestDependency>();
Console.WriteLine(testD1.GetHashCode());
Console.WriteLine(testD2.GetHashCode());
test.ShowTestDependencyHashCode();
}
如果
,则显示2个块,相同哈希码的3倍 <register type="ITestDependency" mapTo="TestDependency">
<lifetime type="singleton"/>
</register>
<register type="MyDependant" />
在app.config中设置。
非常好。我认真地爱Unity。这很热门。
答案 0 :(得分:1)
如果您真正必须在多个UnityContainer实例之间共享相同的实例,最好的解决方案可能是简单地解析一次,然后在所有其他UnityContainer实例中注册实例:
var f = container1.Resolve<IFoo>();
// ..
container42.RegisterInstance<IFoo>(f);
// ..
另一个替代方案是使实现成为真正的 Singleton ,但仍然在每个容器实例中注册实例。这使得它成为一个实现细节,它有一个Singleton正在运行,它消除了Singleton模式的许多缺点,因为消费者永远不会知道它。
但是,最佳解决方案仅使用单个容器。虽然我可以想到一些相当奇特的场景,其中任意数量的容器实例是合适的,但在绝大多数情况下,单个容器实例是正确的配置。