2016-03-08 92 views
5

我使用Microsoft Unity作爲我的IoC容器。我有一些擴展類的它增加了有用的方法來我的業務對象 這是哪門子的代碼,我今天使用:擴展類的依賴注入?

public static class BusinessObjectExtensions 
{ 
    public static bool CanDoStuff(this BusinessObject obj) 
    { 
     var repository = BusinessHost.Resolver.Resolve<IRepository>(); 
     var args = new EArgument { Name = obj.Name }; 
     return repository.AMethod(obj.UserName, args); 
    } 
} 

是否有更好的方法來管理依賴注入擴展類?

+0

我認爲,這並不表示具有任何要求是'延伸method' ..這麼多的依賴對象他們的 – Moumit

回答

2

實際上,您應該儘量避免使用擴展方法,除非它們只處理內部數據(類本身的屬性)或方法中提供的簡單數據類型。您不應該在擴展方法中與其他依賴關係進行交談。如果遵循此規則,則根本不需要向IoC注入擴展類。

+1

這是一個好點。也許我應該創建一個管理類,而不是... – Leonard

4

構造函數注入的事實上的依賴注入的默認方式不可能用於靜態類。可以像下面那樣使用參數注入,但這不是一個很乾淨的方法。

public static class BusinessObjectExtensions 
{ 
    public static bool CanDoStuff(this BusinessObject obj, IRepository repository) 
    { 
     var args = new EArgument { Name = obj.Name }; 
     return repository.AMethod(obj.UserName, args); 
    } 
} 
1

你爲什麼要那樣做?

這會引起應用程序與屋頂的耦合,並且可能會讓您的隊友使用擴展方法(每次使用該方法時都必須牢記注入存儲庫),這會讓您感到非常困惑。

相反,創建一個單獨的類,並使用構造函數注入注入IRepository實例:

public class StuffExecuter  
{ 
    private readonly IRepository _repository; 

    public StuffExecuter(IRepository repository) 
    { 
     _repository = repository; 
    } 

    public bool CanExecute(BusinessObject obj) 
    { 
     _repository.Add(obj.UserName, new EArgument 
     { 
      Name = obj.Name 
     }); 
    } 
} 
+0

這是我們如何通過設計來實現的,但上面的示例來自一個非常具體的(如果不是完全隔離的)用例,其中我們相信便於鉤住功能我們需要我們的業務對象。事後看來,這不是一個好主意,所以我會把它移到其他地方。謝謝! – Leonard