C# 如何使用统一和对象工厂

C# 如何使用统一和对象工厂,c#,inversion-of-control,unity-container,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(va

有一个代码:

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
    }
}
因此,依赖关系是从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
    }
}
此解决方案不起作用,因为应该为每个“使用”对象创建新的依赖实例。好的,我应该注入类似工厂的东西:

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
    }
}
这就是解决办法吗?我很怀疑,因为:

  • 这样的工厂使代码复杂化
  • 我应该如何在DependencyFactory方法Create中实例化依赖项的实例?仅使用New关键字是不好的,因为在这种情况下,我丢失了Unity拦截逻辑(日志记录、缓存等)

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

    关于拦截逻辑(缓存、日志..)。您的工厂仍然实现接口,所以您可以使用.Create方法的拦截器或接口的任何其他方

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

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


    我希望我能帮忙;]

    你能重写你的示例代码来显示实际的代码和在这里命名的类吗?什么是类型的
    依赖关系
    ,为什么需要在每个方法的末尾处理它?这是我的项目中经常遇到的一个通用示例。MyClass的生存期比依赖项长得多。IDisposable对象(非托管资源)必须尽快释放,并仅在需要它们的代码块中使用。