2016-03-08 64 views
2

我是新來的依賴注入和團結,我想出了一個方法來調用所有我註冊的服務Dispose方法。處理所有註冊的服務?

這是我走到這一步。這是我UnityResolver類的一部分:

public class UnityResolver : IDependencyResolver 
{ 
    protected IUnityContainer container; 
    private List<object> serviceList = new List<object>(); 

    public object GetService(Type serviceType) 
    { 
     try 
     { 
      serviceList.Add(container.Resolve(serviceType)); 
      return container.Resolve(serviceType); 
     } 
     catch (ResolutionFailedException) 
     { 
      return null; 
     } 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     try 
     { 
      container.ResolveAll(serviceType).ToList().ForEach(x => serviceList.Add(x)); 
      return container.ResolveAll(serviceType); 
     } 
     catch (ResolutionFailedException) 
     { 
      return new List<object>(); 
     } 
    } 

    public void Dispose() 
    { 
     container.Dispose(); 
     var disposables = serviceList.Where(x => x is IDisposable).ToList(); 

     foreach (IDisposable service in disposables) 
     { 
      service.Dispose(); 
     }  
    } 
} 

它的工作原理,到目前爲止,但有一個最好的(更好的)實踐方法這樣做呢?

謝謝。

+1

您正在解決兩次,如果服務被註冊爲瞬態(默認)會發生什麼? –

+0

檢查這傢伙https://florincoros.wordpress.com/2015/02/17/extending-unity-container-for-idisposable-instances-2nd-approach/ –

+0

好像你正在重新發明輪子兩種方法:方法1](http://thorarin.net/blog/post/2013/02/12/Unity-IoC-lifetime-management-IDisposable-part1.aspx),[方法2](https://florincoros.wordpress.com/2015/1月26日/延伸-團結容器換IDisposable的-實例-第一的方法/)。 – NightOwl888

回答

1

我認爲會解決你的問題是使用一個子容器。

var childContainer = container.CreateChildContainer(); 
// make use of the childContainer 
// .. 
childContainer.Dispose(); // this will dispose any (transient) services created in the lifetime of the Child Container