我一直在寻找一种正确使用IoC容器的好方法,即:
我现在正在开始学习新东西的个人项目,它是一个WPF(4.5)MVVM应用程序,它使用WCF,EntityFramework以及其他技术,框架,模式和实践,我想尝试不同的方法来充分利用容器,工厂和相关模式。
我想到的一个想法是创建一个通用工厂,可以在组合根处设置,而不是传递容器引用。这应避免可测性问题。我们有一个工厂:
class Factory
{
private static Dictionary<Type, Func<object>> Store = new Dictionary<Type,Func<object>>();
public static void Setup<T>(Func<T> Creation)
{
Store.Add(typeof(T), () => Creation());
}
public static T Create<T>()
{
Func<object> func = (from p in Store where p.Key == typeof(T) select p.Value).FirstOrDefault();
if (func != null) return (T)func();
return default(T);
}
}
因此我们在组合根处配置它,例如:
Factory.Setup(() => container.Resolve<ITest>());
Factory.Setup<ISomeWcfService>(() => new SomeWcfService());
最后,要创建一个具体的类型:
ITest t = Factory.Create<ITest>();
ISomeWcfService client = Factory.Create<ISomeWcfService>();
现在的问题和想法:
我刚刚重新发明了servicelocator模式吗?
我知道传递容器是一个坏主意,所以这解决了这个问题并且它不依赖于容器,但这看起来不错还是只是一个简单的坏主意?