我有以下类型的工厂:
public interface IWorkerFactory
{
IWorker Create(IJob job);
void Release(IWorker handler);
}
这家工厂为给定的工作创造工人。这些作业都实现IJob
了,但我想要几个处理不同类型作业的组件:
例如,这两个都源自IJob
interface IJobType1 : IJob { }
interface IJobType2 : IJob { }
我想要两种工人类型,一种处理每种类型的IJob
class Worker1 : IWorker
{
public Worker1(IJobType1 job) { }
}
class Worker2 : IWorker
{
public Worker2(IJobType2 job) { }
}
我已经尝试过了,但是 Windsor 只是IWorker
每次都选择它找到的第一个实现,尝试传递一个IJobType1
to Worker2
(反之亦然),这会引发异常
我已经查看了类型化的工厂组件选择器,但我不太清楚如何使用它来达到预期的效果
这是可能的还是尝试为我的工人类使用通用接口更好?
编辑:
尝试使用通用接口,但这似乎没有给我我正在寻找的 API……关键问题是我真的不想知道它是什么类型,IJob
但我想要最合适的IWorker
实例在解决时创建。
我这样称呼它:
public void ProcessItem(IJob job)
{
IProcessingExceptionLog exLog = null;
IWorker worker = null;
try
{
worker = _workerFactory.Create(job);
// Attempt to process
worker.Process();
}
catch (Exception ex) .... etc
即使我确实将工作转换为更派生的接口,Windsor 仍然选择第一个 IWorker...它对检查密切相关的方法的参数不感兴趣
理想情况下,我想要某种方式来拦截或自定义解析过程,以便我可以确定接受的最接近的匹配签名IJob
是什么。
我可以尝试自己实现一个基于IWorkerFactory
接口的具体工厂。它可以查看所有实现者IWorker
并确定哪些构造函数与最接近的参数匹配,但是,我如何从该实例中的容器解析,因为我没有要使用的容器实例?我真的不喜欢使容器静态的想法