我熟悉Ninject,在Ninject你可以做类似的事情
Bind<ICalendar>().To<MonthCalendar>().WhenInjectedInto(typeof(Roster)).InRequestScope();
我不确定如何在StructureMap中执行类似的操作。我需要能够从我自己的绑定动态地执行此操作,而无需使用通用的StructureMap方法。另外,我需要能够在Registry类中执行此操作。例如......
For(binding.Source).LifecycleIs(GetLifecycle(binding.Scope)).Use(binding.Destination);
我已经查看了stack overflow和codebetter的想法,但无法解决如上所述的Ninject示例中的条件绑定问题。
答案 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>();
})
);