如何编写一个通过字符串创建对象的自定义windsor激活器?

时间:2010-11-21 16:29:11

标签: c# .net castle-windsor activator

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

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 个答案:

答案 0 :(得分:2)

如果我理解正确,问题是您事先不知道将使用IScheduledTask的实现类型,因此您无法正常注册。如果是这种情况,IComponentActivator不是正确的扩展点。请改为ILazyComponentLoader

如果您 知道程序可能使用的IScheduledTask实现,scan and register them normally