Создайте экземпляры класса, которому нужен аргумент конструктора, с помощью StructureMap - PullRequest
3 голосов
/ 14 сентября 2010

У меня есть следующие классы:

public class AllowanceManager : IAllowanceManager
{
    public AllowanceManager(ITranslationManager t_Manager, ISessionManager s_Manager)
    {...}
}

public class TranslationManager : ITranslationManager
{
    public TranslationManager(string culture) 
    {...}
}

public class SessionManager : ISessionManager
{
    public SessionManager(string key) 
    {...}
}

Как я могу инициализировать эти классы в ObjectFactory, чтобы при получении экземпляра IAllowanceManager также автоматически проводные и инициализировали (с аргументами конструктора) StateManager и TranslationManager. Так что мне нужно только извлечь экземпляр IAllowanceDeduction следующим образом:

IAllowanceManager a_Manager = ObjectFactory....// Gets Allowancemanager configured    with initialized instances of IStateManager and ITranslationManager

Ответы [ 3 ]

1 голос
/ 14 сентября 2010

Используя синтаксис 2.6.1, можно написать:

For<ISessionManager>().Use<SessionManager>()
  .Ctor<string>("key").Is(c => GetSessionKey());
For<ITranslationManager>().Use<TranslationManager>()
  .Ctor<string>("culture").Is(c => Thread.CurrentThread.CurrentCulture.Name);
For<IAllowanceManager>.Use<AllowanceManager>();

, где GetSessionKey возвращает ваш ключ сеанса аналогично тому, как разрешается культура

См. Эту запись в блоге для более подробного описания того, как разрешить аргументы конструктора.

1 голос
/ 14 сентября 2010

Редактировать: еще короче.

Поместите это в код загрузчика:

ForRequestedType<IAllowanceManager>().TheDefault.Is
       .ConstructedBy(() => new Allowancemanager(new StateManager(), new TranslationManager()));
0 голосов
/ 14 сентября 2010

Я придумал следующее решение:

IStateManager stateManager = ObjectFactory
    .With<string>("key")
    .GetInstance<IStateManager>();

ITranslationManager translationManager = ObjectFactory
    .With<string>("culture")
    .GetInstance<ITranslationManager>();

manager = ObjectFactory
    .With<ITranslationManager>(translationManager)
    .With<IStateManager>(stateManager)
    .GetInstance<IAllowanceDeductionManager>();
...