【问题标题】:How to use unity and object factoryunity和对象工厂如何使用
【发布时间】:2017-02-15 11:24:24
【问题描述】:

有代码:

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
    }
}

此解决方案不起作用,因为应为每个“使用”创建新的依赖关系实例。好的,我应该注入类似工厂的东西:

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

【问题讨论】:

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

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


【解决方案1】:

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

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

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

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

希望我能帮上忙;]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2017-12-10
    • 1970-01-01
    • 2011-10-07
    • 2013-12-11
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多