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不能在注册表中使用。

抱歉我的英语不好

IRegistrationConvention structuremap CtorDependency

我不是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;
          })
    );