這也讓我感到困惑。雖然對此並不滿意,但我總是得出結論:永遠不會以暫時的方式返回一個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