如何使用统一和对象工厂

时间:2017-02-15 11:24:25

标签: c# inversion-of-control unity-container

有代码:

class MyClass : IMyInterface
{
    public void DoSomething()
    {
        using(var dependency = new Dependency())
        { 
           // some code
        }

        // some code
    }

    public void DoSomething2()
    {
        using(var dependency = new Dependency())
        { 
           // some code
        }

        // some code
    }
}

因此,Dependency是一个继承自IDisposable的类。

我想使用Unity容器重写代码:

class MyClass : IMyInterface
{
    private readonly IDependency _dependency;

    public MyClass(IDependency dependency)
    {
        _dependency = dependency;
    }

    public void DoSomething()
    {
        using(_dependecy)
        { 
           // some code
        }

        // some code
    }

    public void DoSomething2()
    {
        using(_dependecy)
        { 
           // some code
        }

        // some code
    }
}

此解决方案不起作用,因为应为每个“using”创建新的Dependency实例。好吧,我应该像工厂那样注入一些东西:

class MyClass : IMyInterface
{
    private readonly IDependencyFactory _dependencyFactory;

    public MyClass(IDependencyFactory dependencyFactory)
    {
        _dependencyFactory = dependencyFactory;
    }

    public void DoSomething()
    {
        using(var dependency = _dependecyFactory.Create())
        { 
           // some code
        }

        // some code
    }

    public void DoSomething2()
    {
        using(var dependency = _dependecyFactory.Create())
        { 
           // some code
        }

        // some code
    }
}

这是解决方案吗?我有疑问,因为:

  1. 这些工厂使代码复杂化。
  2. 如何在DependencyFactory方法Create中实例化Dependency实例?只使用New关键字并不好,因为在这种情况下我失去了Unity拦截逻辑(日志记录,缓存等)。

1 个答案:

答案 0 :(得分:1)

我认为工厂方法就是解决方案。我一直处于同样的境地,我的解决方案也是工厂。它符合您提供创建类型实例的抽象方法的要求。

关于拦截逻辑(cache,logg ..)。您的工厂仍然实现接口,因此您可以使用.Create方法或任何其他接口方的拦截器。

如果您的一次性物品的方法也需要被拦截,我可以采用这种方法:

您可以在工厂中注入容器并使用带工厂的容器来创建一次性对象的实例,这样您就可以保留所有拦截逻辑。但是你应该小心,滥用容器的使用导致了非常糟糕的编写代码。从我的角度来看,限制将容器注入工厂是可以接受的。

我希望我帮忙;]