如何使用统一和对象工厂

How to use unity and object factory

有验证码:

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 是 class 继承自 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" 创建新的依赖实例。好的,我应该注入类似 factory:

的东西
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 拦截逻辑(日志记录、缓存等)。

我认为 工厂方法是解决方案。我遇到过同样的情况,我的解决方案也是工厂。它符合您提供创建类型实例的抽象方式的要求。

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

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

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

希望我能帮到你 ;]