【发布时间】: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
}
}
这是解决方案吗?我很怀疑,因为:
- 这样的工厂使代码复杂化。
- 我应该如何在 DependencyFactory 方法 Create 中实例化一个 Dependency 实例?只使用 New 关键字不好,因为在这种情况下我会丢失 Unity 拦截逻辑(日志记录、缓存等)。
【问题讨论】:
-
你能重写你的示例代码来显示实际的代码和在这里命名的类吗?
Dependency的类型是什么,为什么需要在每个方法的末尾处理它? -
这是我项目中经常遇到的通用示例。 MyClass 的生命周期比依赖关系长得多。 IDisposable-objects(非托管资源)必须尽快释放,并且只在需要它们的代码块中使用。
标签: c# inversion-of-control unity-container