问题&关于IoC,组合根,服务主机,工厂的想法

时间:2012-11-14 16:19:41

标签: c# ioc-container service-locator

我一直在寻找一种正确使用IoC容器的好方法,即:

  • 严格按composition root
  • 使用容器
  • 不使用常见的ServiceLocator(或类似的)来避免可测试性问题。

我现在正在开始学习新东西的个人项目,它是一个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模式吗?

我知道传递容器是一个坏主意,所以这解决了这个问题并且它不依赖于容器,但这看起来不错还是只是一个简单的坏主意?

0 个答案:

没有答案