代码之家  ›  专栏  ›  技术社区  ›  the_drow

如何编写通过字符串创建对象的自定义windsor activator?

  •  1
  • the_drow  · 技术社区  · 14 年前

    我有一个控制台应用程序,它接收类名并调用其函数:

    Assembly asm = Assembly.GetEntryAssembly();
    ObjectHandle oh = Activator.CreateInstance(asm.FullName, typeName);
    
    IScheduledTask task = (IScheduledTask)oh.Unwrap();
    task.Execute();
    

    到目前为止,除此之外,还不需要进行初始化,但现在我们有了一些组件,这些组件将通过构造函数注入来部署和打开IScheduledTask。
    是否有方法用类的相同名称定义一个命名实例,稍后将使用resolve解析所有依赖项?
    如果我得到“SomeScheduledTask”作为参数,我可以这样做:

    IScheduledTask task = (IScheduledTask)container.Resolve(typeName); // I know this is possible. The problem is the registration.
    

    我可以这样做来解决我的问题吗:

    container.Register(Component.For<IScheduledTask>().Named(t => t.Name).Activator<MyActivator>())
    

    在我的激活器里做这样的事情:

    public class MyActivator : IComponentActivator
    {
         public object Create(CreationContext context)
        {
            string typeName = context.???; // How do I get the named instance name from here?
            Assembly asm = Assembly.GetEntryAssembly();
            ObjectHandle oh = Activator.CreateInstance(asm.FullName, typeName);
    
            IScheduledTask task = (IScheduledTask)oh.Unwrap();
            task.Execute();
        }
    
        public void Destroy(object instance)
        {
    
        }
    }
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Binary Worrier    8 年前

    如果我理解正确,问题是您事先不知道IScheduledTask将使用什么实现类型,因此无法正常注册它。如果是这样,则IComponentActivator不是要使用的正确扩展点。尝试 ILazyComponentLoader 相反。

    如果你 了解程序可能使用的计划外任务实现, scan and register them normally .