2017-02-15 41 views
0

有一個代碼:如何使用統一和對象工廠

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

因此,依賴是自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方法中的Dependency實例?只使用New關鍵字並不好,因爲在這種情況下,我失去了Unity攔截邏輯(日誌記錄,緩存等)。
+0

你能重寫你的示例代碼來顯示在這裏播放的實際代碼和類嗎?什麼是'Dependency'類型,爲什麼你需要在每種方法的末尾處置它? – Steven

+0

這是我的項目中經常遇到的一個通用示例。 MyClass的生命週期遠遠長於依賴關係。必須儘快處理IDisposable對象(非託管資源),並僅在需要它們的代碼塊中使用。 – Hopeless

回答

1

我想這裏的工廠的方法是解決方案。我一直處於同樣的情況,我的解決方案也是工廠。它適合您提供創建類型實例的抽象方式的要求。

關於攔截邏輯(cache,logg ..)。您的工廠仍然實現接口,因此您可以使用.Create方法的攔截器或任何其他接口方。

如果您的可支配對象的方法也需要被攔截我可以這樣這種方法的:

可以注入容器在工廠和使用容器withing工廠創建的實例一次性對象,這樣你將保留所有的攔截邏輯。但你應該小心,濫用容器的使用導致真的很差的書面代碼。從我的角度來看,限制容器注入工廠仍然是可以接受的。

我希望我幫忙;]