2011-06-25 352 views
0

我嘗試做以下引導:如何在StructureMap的ObjectFactory.Initialize調用中使用命名實例?

  x.For(Of IErrorLogger).Use(Of ErrorLogger.SQLErrorLogger)(). 
       Ctor(Of IErrorLogger)("backupErrorLogger").Is(ObjectFactory.GetNamedInstance(Of IErrorLogger)("Disk")) 

      x.For(Of IErrorLogger).Add(
       Function() 
        Return New ErrorLogger.DiskErrorLogger(
         CreateErrorFileName(ServerMapPath(GetAppSetting("ErrorLogFolder")))) 
       End Function).Named("Disk") 

但它顯示了這個錯誤:

StructureMap異常代碼:200 無法找到名爲「磁盤」爲PluginType Logging.IErrorLogger

一個實例

我有點理解爲什麼會發生這種情況..問題是,我如何利用註冊表中的命名實例?也許像SQLErrorLogger的ctor參數的延遲初始化一樣?我不知道如何讓它發生。

在此先感謝您提供的任何幫助。

回答

0

您的問題是,您正在嘗試訪問容器之前它已配置。爲了使結構圖評估配置後的對象分辨率,您需要爲Is函數提供一個lambda。在嘗試解析已註冊的類型時,將會評估lambda。

x.[For](Of ILogger)().Add(Of SqlLogger)().Ctor(Of ILogger)("backupErrorLogger")_ 
    .[Is](Function(context) context.GetInstance(Of ILogger)("Disk")) 
x.[For](Of ILogger)().Add(Of DiskLogger)().Ctor(Of String)("errorFileName")_ 
    .[Is](CreateErrorFileName(ServerMapPath(GetAppSetting("ErrorLogFolder"))))_ 
    .Named("Disk") 

聲明:我並沒有完全掌握VB.NET中的lambda語法,但我希望自己的理解正確。

編輯:

這個我發佈之前試過自己工作的C#版本是這樣的:

ObjectFactory.Initialize(i => 
      { 
       i.For<ILogger>().Add<SqlLogger>() 
        .Ctor<ILogger>("backup").Is(
         c => c.GetInstance<ILogger>("disk")) 
        .Named("sql"); 
       i.For<ILogger>().Add<DiskLogger>().Named("disk"); 
      }); 

var logger = ObjectFactory.GetNamedInstance<ILogger>("sql"); 
+0

我相信你的意思是使用上下文。「實例」,而不是。這在我的問題中不會出於同樣的原因。我提供了一個簡短的解釋我的答案。 – SamVanity

+0

我從一個C#spike翻譯了我,並且完美地工作。什麼不適合這個?你得到200嗎?查看我編輯的代碼,我嘗試並開始工作。 – PHeiberg

1

我找到了正確的方式做到這一點在最新的版本(2.6.1) StructureMap的:

x.For(Of IErrorLogger).Use(Of ErrorLogger.SQLErrorLogger)(). 
    Ctor(Of IErrorLogger)("backupErrorLogger").Is(
     Function(c) c.ConstructedBy(Function() ObjectFactory.GetNamedInstance(Of IErrorLogger)("Disk")) 
     ) 

x.For(Of IErrorLogger).Add(Function() _ 
     New ErrorLogger.DiskErrorLogger(
      CreateErrorFileName(ServerMapPath(GetAppSetting("ErrorLogFolder")))) 
     ).Named("Disk") 

的構造函數的方法是通知,我們需要提供一個FUNC(IContext),並使用IContext.ConstructedBy(Func鍵())在這種情況下調用ObjectFactory.Get ...來成功註冊IErrorLogger。

就我所知,這是唯一的方法。其他Icontext方法(如IsThis和Instance)僅適用於已註冊的類型。

相關問題