【问题标题】:Setting up structure map in a c# console application在 C# 控制台应用程序中设置结构映射
【发布时间】:2011-07-21 14:27:37
【问题描述】:

我收到此错误:

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


        }
    }

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

【问题讨论】:

  • “他们主网站上的指南似乎很旧,使用旧语法等。” StructureMap 在这方面有点臭名昭著。
  • 您正在使用 ObjectFactory 来获取实例,但您正在配置 2 个完全独立的容器。试试 ObjectFactory.Configure

标签: c# ioc-container structuremap


【解决方案1】:

尝试将您的配置应用到静态 ObjectFactory 而不是您似乎立即丢弃的单独容器..

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

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

【讨论】:

  • 谢谢!因此,在 Web 应用程序中,我只需在 global.asax 文件中的应用程序开始请求中对 Setup() 进行此调用?
【解决方案2】:

之前的答案是针对 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();
}

这使 Main 保持非常干净,并允许 Application 通过 dependency injection 请求它需要的任何依赖项并遵循 Explicit Dependencies Principle。结合起来,这些使您的应用程序非常可组合和可测试。

【讨论】:

  • Application 类呢?我们从容器中获取它,但从不显式注册它。它的注册是否由 StructureMap 的“默认约定”处理?
【解决方案3】:
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"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多