这也让我感到困惑。虽然对此并不满意,但我总是得出结论:永远不会以暂时的方式返回一个IDisposable对象是最好的。
最近,我为自己解释了这个问题:这真的是IoC问题还是.net框架问题?无论如何,处置都很尴尬。它没有意义的功能目的,只有技术。所以这是一个我们不得不处理的框架问题,而不是IoC问题。
我喜欢DI的一点是,我可以要求提供我的功能的合同,而不必打扰技术细节。我不是主人。没有关于它在哪一层的知识。没有关于完成合同需要哪些技术的知识,不用担心一生。我的代码看起来不错,干净,而且是高度可测试的。我可以在他们所属的层次上实施责任。
因此,如果这个规则有一个例外,它要求我组织生命期,那么让我们来做这个例外。我是否喜欢它。如果实现接口的对象需要我来处理它,我想知道它,因为那时我会触发尽可能短的对象。使用一段时间后放置的子容器解决它的一个诡计可能仍然会导致我保持对象的存活时间超过我应该的时间。注册对象时确定对象的允许使用期限。不是通过创建子容器的功能并在一定时间内保持该容器。因此,只要我们的开发人员需要担心处置(将会改变吗?),我会尝试尽可能少地注入瞬态的一次性对象。 1.我尝试让对象不是IDisposable,例如,不要在类级别保留一次性对象,而是在较小的范围内。 2.我尝试使对象可重用,以便可以应用不同的生命期管理器。
如果这是不可行的,我使用工厂来表明注入合同的用户是所有者,并且应该对其负责。
有一个警告:将合同执行者从非一次性更改为一次性将是一个突破性变化。那时界面将不再被注册,而是到工厂的界面。但我认为这也适用于其他场景。忘记使用子容器会从那时起给内存问题。工厂方法将导致IoC解决异常。
一些示例代码:
using System;
using Microsoft.Practices.Unity;
namespace Test
{
// Unity configuration
public class ConfigurationExtension : UnityContainerExtension
{
protected override void Initialize()
{
// Container.RegisterType<IDataService, DataService>(); Use factory instead
Container.RegisterType<IInjectionFactory<IDataService>, InjectionFactory<IDataService, DataService>>();
}
}
#region General utility layer
public interface IInjectionFactory<out T>
where T : class
{
T Create();
}
public class InjectionFactory<T2, T1> : IInjectionFactory<T2>
where T1 : T2
where T2 : class
{
private readonly IUnityContainer _iocContainer;
public InjectionFactory(IUnityContainer iocContainer)
{
_iocContainer = iocContainer;
}
public T2 Create()
{
return _iocContainer.Resolve<T1>();
}
}
#endregion
#region data layer
public class DataService : IDataService, IDisposable
{
public object LoadData()
{
return "Test data";
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
/* Dispose stuff */
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
#endregion
#region domain layer
public interface IDataService
{
object LoadData();
}
public class DomainService
{
private readonly IInjectionFactory<IDataService> _dataServiceFactory;
public DomainService(IInjectionFactory<IDataService> dataServiceFactory)
{
_dataServiceFactory = dataServiceFactory;
}
public object GetData()
{
var dataService = _dataServiceFactory.Create();
try
{
return dataService.LoadData();
}
finally
{
var disposableDataService = dataService as IDisposable;
if (disposableDataService != null)
{
disposableDataService.Dispose();
}
}
}
}
#endregion
}
我的解决办法是使用一个IoC和适当和公编纂寿命管理:AutoFac和城堡温莎有这样的(尽管它们的工作方式略有不同);在处理默认终身管理器下的瞬变时,2.1单元根本失败。 – user2864740 2015-03-03 21:00:06