Настройка структуры карты в консольном приложении c # - PullRequest
2 голосов
/ 21 июля 2011

Я получаю эту ошибку:

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


        }
    }

Это моя первая попытка использования карты структуры, чего мне не хватает?Похоже, что руководство на их главном сайте очень старое с использованием старого синтаксиса и т. Д.

Ответы [ 3 ]

5 голосов
/ 21 июля 2011

Попробуйте применить свою конфигурацию к статической ObjectFactory вместо отдельных контейнеров, которые, как вам кажется, сразу выбрасываются ..

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

                config.For<ISomething>().Use<SomeThingOne>();
            });
    }
3 голосов
/ 20 февраля 2016

Предыдущие ответы относятся к StructureMap 2 или 3, но в StructureMap 4 синтаксис изменился.Вы можете увидеть полное решение здесь:

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

По существу, ObjectFactory был заменен экземпляром контейнера.При желании вы также можете выполнить настройку в отдельном экземпляре реестра, что рекомендуется.Таким образом, ваш код инициализации в Main () становится:

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

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

Это делает Main очень чистым и позволяет Приложению запрашивать любые зависимости, которые ему нужны, через внедрение зависимостей и следовать Принцип явных зависимостей .В совокупности это позволяет вашему приложению быть очень легко компонуемым и тестируемым.

1 голос
/ 21 июля 2011
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"));
...