在c#控制台应用程序中设置结构映射

本文关键字:设置 结构 映射 应用程序 控制台 | 更新日期: 2023-09-27 18:02:55

我收到这个错误:

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

        }
    }

这是我第一次尝试使用结构图,我缺少什么?他们主网站上的指南似乎使用了旧语法等,非常陈旧。

在c#控制台应用程序中设置结构映射

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

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

前面的答案是针对StructureMap 2或3的,但在StructureMap 4中,语法发生了变化。你可以在这里看到一个完整的解决方案:

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

从本质上讲,ObjectFactory已被Container实例所取代。您也可以选择在单独的注册表实例中执行配置,这是推荐的。因此,Main((中的初始化代码变为:

static void Main(string[] args)
{
    var container = Container.For<ConsoleRegistry>();
    var app = container.GetInstance<Application>();
    app.Run();
    Console.ReadLine();
}

这使Main保持非常干净,并允许应用程序通过依赖项注入请求所需的任何依赖项,并遵循显式依赖项原则。结合在一起,可以使您的应用程序非常可组合和可测试。

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"));