如何在注册表中的StructureMap中执行条件绑定而不使用泛型?

时间:2010-10-16 14:51:40

标签: dependency-injection structuremap ioc-container

我熟悉Ninject,在Ninject你可以做类似的事情

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

我不确定如何在StructureMap中执行类似的操作。我需要能够从我自己的绑定动态地执行此操作,而无需使用通用的StructureMap方法。另外,我需要能够在Registry类中执行此操作。例如......

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

我已经查看了stack overflowcodebetter的想法,但无法解决如上所述的Ninject示例中的条件绑定问题。

1 个答案:

答案 0 :(得分:0)

如果我正确解释您的Ninject配置 - 结构图中的通用解决方案将是:

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

修改

对于使用完全动态注册而做同样的事情,你应该可以使用它:

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