2011-07-21 73 views
2

我得到這個錯誤:在C#控制檯應用程序設置結構圖

StructureMap Exception Code: 202 
No Default Instance defined for PluginFamily 

我的設置是這樣的:

Console.WriteLine("Structure Map"); 
SetupSM sm = new SetupSM(); 
sm.Setup(); 

ISomeThing someThing = ObjectFactory.GetInstance<ISomeThing>(); 
Console.WriteLine("something.HowManyTHings: " + someThing.HowManyThings("asdf")); 



public class SetupSM 
    { 
     public void Setup() 
     { 
      var c1 = new Container(config => 
      { 
       config.Scan(scan => 
       { 
        scan.TheCallingAssembly(); 
        scan.WithDefaultConventions(); 
       }); 
      }); 

      var c2 = new Container(x => 
               { 
                x.For<ISomeThing>().Use<SomeThingOne>(); 
               }); 


     } 
    } 

這是我第一次嘗試用結構圖,我是什麼我錯過了? 似乎使用舊的語法上他們的主要網站上的指導是很老等

+0

「看來他們的主網站上的指南很老,使用舊的語法等。」 StructureMap對此有點臭名昭着。 – jason

+0

您正在使用ObjectFactory來獲取實例,但是您正在配置2個完全獨立的容器。試試ObjectFactory.Configure – MattDavey

回答

5

嘗試將你的配置靜態的ObjectFactory,而不是你似乎立即扔掉單獨的容器..

public class SetupSM 
    { 
     public void Setup() 
     { 
      ObjectFactory.Configure(config => 
      { 
       config.Scan(scan => 
       { 
        scan.TheCallingAssembly(); 
        scan.WithDefaultConventions(); 
       }); 

       config.For<ISomething>().Use<SomeThingOne>(); 
      }); 
    } 
+0

謝謝你做到了!因此,在一個Web應用程序中,我只需要在global.asax文件中的應用程序開始請求中對Setup()進行調用? – codecompleting

1
public static class StructureMapBootStrapper 
{ 
    public static void BootStrap() 
    { 
     StructureMap.ObjectFactory.Initialize(
      bootStrapper => 
      { 
       bootStrapper.For<ISomeThing>().Use<SomeThingOne>(); 
      }); 
    } 
} 

您的控制檯應用程序:

Console.WriteLine("Structure Map"); 
StructureMapBootStrapper.BootStrap(); 

ISomeThing someThing = ObjectFactory.GetInstance<ISomeThing>(); 
Console.WriteLine("something.HowManyTHings: " + someThing.HowManyThings("asdf")); 
2

以前的答案是StructureMap 2或3,但在StructureMap 4語法發生了變化。你可以在這裏看到一個完整的解決方案:

http://ardalis.com/using-structuremap-4-in-a-console-app

從本質上講,ObjectFactory的已被替換成一個容器實例。您也可以選擇在建議的單獨的Registry實例中執行配置。因此,在主(初始化代碼)變爲:

static void Main(string[] args) 
{ 
    var container = Container.For<ConsoleRegistry>(); 

    var app = container.GetInstance<Application>(); 
    app.Run(); 
    Console.ReadLine(); 
} 

這使主非常乾淨,並允許應用程序請求它需要通過dependency injection任何依賴關係,並遵循Explicit Dependencies Principle。結合起來,這些允許您的應用程序非常易於組合和測試。

+0

完整示例http://ardalis.com/using-structuremap-4-in-a-console-app – Dude0001