2009-10-28 31 views
1

我有一個爲我的控制器定義的貪婪構造函數。每個控制器都需要一個ILoggingService實例。現在我的依賴注入(這是StructureMap ..但如果你不使用它,請繼續閱讀)工作正常..但我想使它ILoggingService貪婪的構造函數需要String。這個值將是控制器的完全限定名稱。或者一些文本(如果太難了)。依賴注入和ASP.NET MVC遇到問題

如當前代碼..

public AccountController(IAccountService accountService, 
    ILoggingService loggingService) { ... } 

如如意pseduo代碼...

public AccountController(IAccountService accountService, 
    ILoggingService loggingService(this.GetType().ToString() 
    .. or hardcod "X.Y..AccountController") 
{ ... } 

這可能嗎?我猜我可能不得不在註冊表/ bootstrap中定義一些棘手的問題?

注意:我試過使用反射,但這不起作用,因爲IoC使用實例構建器thingy,它會爲每個注入的實例生成唯一的對象名稱。

請幫忙!

回答

1

你可以讓ILoggingService成爲一個通用的嗎?那麼你可以要求ILoggingService<AccountController>

你的日誌服務可以利用它,像這樣:

class LoggingService<T> : ILoggingService<T>{ 
    ... 
    var thingName=typeof(T).ToString(); 
    ... 
} 
0

你不能有一個構造函數的接口上的。

DI和鬆耦合的其中一點是協作者​​只通過接口彼此瞭解。如何創建實例並不關心消費者。

你可能有ILoggingService的實現,本身需要一定的依賴性,但應該是沒有關心到控制器的 - 它必須能夠與工作的任何實施ILoggingService的,否則你會被打破Liskov替換原理。

然而,有時您需要將消費者的方面與依賴關係進行交流,但這最好作爲方法參數完成 - 例如,您可以將相關字符串作爲參數傳遞給ILoggingService中的方法。

0

注入記錄器工廠ILoggerFactory,您可以要求記錄器的某個名稱:this.logger = _factory.GetLogger(GetType()。Name())。

請注意,這不是IoC特定的解決方案。我不是IoC的大專家(儘管我使用Windsor),所以他們可以提供手動實例的方法。像

ioc.ForComponent(typeof(ILoggerService)).CustomInstantiate((type, desttype) => 
    Activator.CreateInstance(type, new object[]{desttype.Name})) 
  • 但這樣的東西我沒有知識。特別是考慮到你希望IoC不僅給你創建的類型,而且還會讓你使用實例的類型。