Зарегистрировать экземпляр по умолчанию в StructureMap - PullRequest
1 голос
/ 04 июля 2011

У меня есть класс (MyService), который имеет статическое свойство (MyService.Context), которое представляет текущий контекст (который специфичен для текущего пользователя, вошедшего в систему, поэтому он изменяется).

Чего я пытаюсь достичь, я

ObjectFactory.Initialize(x =>
            {
                x.For<IMyService>().Use<MyInstance>(c => c.Use(MyService.Context));
            });

т.е. так что для каждого ObjectFactory.GetInstance<IMyService>() я получаю ссылку на MyService.Context

Это выполнимо?

UPDATE

Я не могу использовать одноэлементный шаблон, поскольку MyService.Context изменяется в зависимости от пользователя, отправляющего запрос (через HttpContext).

В указанном выше псевдокоде лямбда-параметр c представляет контекст SM, так что я могу вернуть пользовательский результат для каждого запроса. Я знаю о SM Intercept(), но он срабатывает после объекта, а не вместо .

Ответы [ 2 ]

3 голосов
/ 04 июля 2011

Если вы можете работать со свойством, есть возможность добавить метод OnCreation.Предоставленное действие выполняется для экземпляра сразу после создания:

ObjectFactory.Initialize(x =>
        {
            x.For<IMyService>()
             .Use<MyInstance>()
             .OnCreation(x => x.Context = MyService.Context;
        });

Или вы можете использовать ленивую инициализацию и предоставить Func методу Use, который выполняется всякий раз, когда требуется новый экземпляр.Это должно выполняться в правильном контексте:

ObjectFactory.Initialize(x =>
        {
            x.For<IMyService>()
             .Use<MyInstance>(() => new MyInstance(MyService.Context);
        });

Я надеюсь, что один из этих методов работает для вас.

0 голосов
/ 04 июля 2011

При условии, что MyService имеет аргумент ctor для IContext:

For<IContext>().Add(c => MyService.Context).Named("context");
For<IMyService>().Use<MyService>()
    .Ctor<IContext>().Is(c => c.GetInstance<IContext>("context"));

или если вы хотите установить контекст по умолчанию для всех зависимых:

For<IContext>().Use(() => MyService.Context);
For<IMyService>().Use<MyService>();

Лямбда-выражение будет вв обоих случаях контекст разрешается при запросе экземпляра MyService.

...