Castle.Windsor IoC 容器特定配置

Castle.Windsor IoC-container specific configuration

我选择 Castle.Windsor 作为我的应用程序的 IoC 容器。这是我的第一个 IoC 经验,所以我需要配置它的建议。

应用程序的根 class 是 Scheduler。它计划和执行不同类型的 "jobs"。每个作业都实现了IWorker接口,所以我决定在Scheduler中注入一个List<IWorker>。以后会有很多种"jobs",现在有两种:CleanerWriterScheduler 需要 Cleaner 的单个实例,因此默认 Singleton Lifestyle 就可以了。但我还需要注入 Writer 的数量取决于某些文件夹中 XML 文件的数量。就我而言,实现此目标的最佳模式是什么?

配置容器:

var container = new WindsorContainer();
// For IList injecting
container.Kernel.Resolver.AddSubResolver(new ListResolver(container.Kernel, true));
// Registering Scheduler
container.Register(CastleRegistration.Component.For<IScheduler>().ImplementedBy<Scheduler>);
// Registering Workers
container.Register(CastleRegistration.Component.For<IWorker>().ImplementedBy<Writer>());
container.Register(CastleRegistration.Component.For<IWorker>().ImplementedBy<Writer>());
// ... there are multiple Writers depends on XML files count
container.Register(CastleRegistration.Component.For<IWorker>().ImplementedBy<Cleaner>());
// Resolving
var sched = container.Resolve<IScheduler>();

调度器:

public class Scheduler : IScheduler
{
    public IList<IWorker> Workers { get; set; }

    public Scheduler(IList<IWorker> workers)
    {
        Workers = workers;
    }
}

作者:

public class Writer : IWorker
{
    public string Source { get; set; }

    public Writer()
    {
    }

    public Writer(string source)
    {
        Source = source;
    }
}

清洁工:

public class Cleaner : IWorker
{
    public Cleaner()
    {
    }
}

更新: 我需要在每个 Parser 中传递一个参数对象(从 XML 反序列化)。 我应该只在容器配置中使用 foreach 循环吗?温莎的 Typed 工厂能帮上忙吗?我需要一些指导。

基本上你想做的是这些方面的事情:

public class WriterFactory : IWriterFactory
{
    public Writer Create(string fileName)
    {
        return new Writer(fileName);
        //if your writers have other dependencies then inject those into the factory via the constructor and use them here
    }
}

然后注册这个工厂

container.Register(CastleRegistration.Component.For<IWriterFactory>().ImplementedBy<WriterFactory>());

然后在任何需要创建编写器的地方依赖构造函数中的IWriterFactory