我有一个控制台应用程序,它接收一个类名并调用它的函数:
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)
{
}
}
答案 0 :(得分:2)
如果我理解正确,问题是您事先不知道将使用IScheduledTask的实现类型,因此您无法正常注册。如果是这种情况,IComponentActivator不是正确的扩展点。请改为ILazyComponentLoader。
如果您 知道程序可能使用的IScheduledTask实现,scan and register them normally。