Как выполнить условное связывание в StructureMap из реестра и без использования обобщений? - PullRequest
1 голос
/ 16 октября 2010

Я знаком с Ninject, и в Ninject вы можете сделать что-то похожее на

Bind<ICalendar>().To<MonthCalendar>().WhenInjectedInto(typeof(Roster)).InRequestScope();

Я не уверен, как выполнить нечто подобное в StructureMap.Мне нужно иметь возможность делать это динамически из моей собственной привязки без использования общих методов StructureMap.Кроме того, я должен быть в состоянии сделать это из класса реестра.Например ...

For(binding.Source).LifecycleIs(GetLifecycle(binding.Scope)).Use(binding.Destination);

Я смотрел на переполнение стека и codebetter для идей, но не могу понять, как сделать условное связывание, как в вышеупомянутомПримерный пример.

1 Ответ

0 голосов
/ 18 октября 2010

Если я правильно интерпретирую вашу конфигурацию Ninject - общее решение в карте структуры будет:

For<Roster>().HttpContextScoped().Use<Roster>()
  .Ctor<ICalendar>().Is<MonthCalendar>();

Edit:

Чтобы сделать то же самое с полностью динамическими регистрациями, вместо этого вы должны использовать это:

For(binding.Source).LifecycleIs(binding.Lifecycle)
  .Use(binding.Destination).Child(binding.ChildSource)
  .IsConcreteType(binding.ChildDestination);

Для динамической настройки регистрации типа вы можете использовать соглашение:

public class DynamicConvention : IRegistrationConvention
{
        public void Process(Type type, Registry registry)
        {
            TypeRegistrationSettings typeSettings = FindTypeSettings(type);
            if (typeSettings == null)
                return;

            registry.For(typeSettings.Source)
              .LifecycleIs(typeSettings.Lifecycle).Use(typeSettings.Destination);
        }
}

Где FindTypeSettings (type) будет искать ваши собственные привязки.

Соглашение зарегистрировано при сканировании:

ObjectFactory.Initialize(
                c => 
                    c.Scan(s => {
                        s.TheCallingAssembly();
                        s.Convention<DynamicConvention>();
                    })
                );
...