2013-07-04 21 views
1

我有一個類,它的構造看起來像如何找出在StructureMap中提供依賴項的類型?

public class Foo(NLog.Logger logger) 

我使用StructureMap 2.6.4.1做的依賴注入(通過構造函數注入完全,沒有財產注射)。我正在使用NLog進行記錄。 NLog的一個很好的功能是可以通過具有名稱的記錄器將記錄事件發送到不同的目標。因此,在擁有類型的完全限定名稱之後命名記錄器(在上例中,它將是<namespace>.Foo

Castle Windsor的日誌記錄工具將爲需要它們的實例提供記錄器,命名爲擁有實例的類。

但是,我還沒有能夠得到StructureMap來做到這一點。

我試過EnrichWith((context, type) => {})方法,但context.ParentType始終爲空。以下是我的註冊表示例:

public class InfrastructureRegistry : Registry 
{ 
    public InfrastructureRegistry() 
    { 
     For<NLog.Logger>().Use<NLog.Logger>() 
      .EnrichWith((context, pluginType) => 
       NLog.LogManager.GetLogger(context.ParentType.FullName) 
      ); 
    } 
} 

我很困惑。我如何做我想做的事?

回答

3

ParentType在上下文中,如果構建堆棧頂部的對象正在被請求,則返回null,這意味着請求記錄器。我嘗試了一個簡單的場景,一個類依賴於一個NLog.Logger的類,它完美運行。

c.For<NLog.Logger>().Use(ctx => ctx.ParentType == null ? 
    NLog.LogManager.GetLogger(ctx.BuildStack.Current.ConcreteType.Name) : 
    NLog.LogManager.GetLogger(ctx.ParentType.UnderlyingSystemType.Name)); 

我具有下列依賴類:

public class Service : IService 
{ 
    private readonly NLog.Logger _logger; 
    public Service(NLog.Logger logger) 
    { 
     _logger = logger; 
    } 
} 

其與名稱服務產生的NLog.Logger

如果這不適用於你我認爲你需要產生一個小問題的repro。

順便說一句,你不需要EnrichWith,除非你想用別的東西包裝構造的實例或者使用構造的實例中的一些數據。

+0

非常感謝! –

相關問題