IRegistrationConvention structuremap CtorDependency
本文关键字:CtorDependency structuremap IRegistrationConvention | 更新日期: 2023-09-27 18:06:39
我需要在扫描仪中发送一个自定义实例。这是我的代码
public class RunnableScanner : IRegistrationConvention
{
private readonly List<Module> modules;
public RunnableScanner()
{
var config = RegisterModulesConfig.GetConfig();
modules = config.Modules.ToList();
}
public void Process(Type type, Registry registry)
{
if (!type.IsAbstract && typeof(IRunnable).IsAssignableFrom(type))
{
var module = modules.SingleOrDefault(c => c.Name == type.Name);
if (module != null)
{
registry.For(typeof (IRunnable)).Use(type).Named(type.Name).CtorDependency<Scheduler>("scheduler")
.IsNamedInstance(module.Scheduler + "Scheduler");
}
}
}
}
registry.For(typeof (IRunnable)).Use(type).Named(type.Name).CtorDependency<Scheduler>("scheduler") .IsNamedInstance(module.Scheduler + "Scheduler");
我需要为Scheduler("Interval"属性)设置一个值。
I did try this:
var sch = ObjectFactory.GetNamedInstance<Scheduler>(module.Scheduler + "Scheduler");
sch.Interval = module.Interval;
registry.For(typeof (IRunnable)).Use(type).Named(type.Name).CtorDependency<Scheduler>("scheduler").Is(sch);
但是这不起作用,因为ObjectFactory不能在注册表中使用。
抱歉我的英语不好
我不是structuremap专家,所以这可能不是最好/最优雅/最有效的解决方案。
但是下面使用LambdaInstance
的注册似乎可以工作
registry.For(typeof (IRunnable)).Use(type).Named(type.Name)
.CtorDependency<Scheduler>("scheduler")
.Is(new LambdaInstance<Scheduler>(c =>
{
var sch = c.GetInstance<Scheduler>(module.Scheduler + "Scheduler");
sch.Interval = module.Interval;
return sch;
})
);