在ac#console应用程序中设置结构图

cod*_*ing 2 c# structuremap ioc-container

我收到这个错误:

StructureMap Exception Code:  202
No Default Instance defined for PluginFamily 
Run Code Online (Sandbox Code Playgroud)

我的设置如下:

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>();
                                              });


        }
    }
Run Code Online (Sandbox Code Playgroud)

这是我第一次尝试使用结构图,我错过了什么?看来他们主网站上的指南使用旧语法等很老了.

Mat*_*vey 5

尝试将您的配置应用于静态ObjectFactory而不是您看起来立即丢弃的单独容器.

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

                config.For<ISomething>().Use<SomeThingOne>();
            });
    }
Run Code Online (Sandbox Code Playgroud)


ssm*_*ith 5

之前的答案是针对 StructureMap 2 或 3,但在 StructureMap 4 中,语法已更改。您可以在此处查看完整的解决方案:

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

本质上,ObjectFactory 已被 Container 实例替换。您还可以选择在单独的 Registry 实例中执行配置,建议这样做。因此,您在 Main() 中的初始化代码变为:

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

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

这使 Main 非常干净,并允许应用程序通过依赖注入请求它需要的任何依赖并遵循显式依赖原则。结合起来,这些使您的应用程序非常可组合和可测试。