Castle.Windsor IoC容器特定配置

时间:2015-05-12 09:19:10

标签: c# dependency-injection inversion-of-control castle-windsor ioc-container

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

该应用的根类为Scheduler。它计划并执行不同类型的“工作”。每个作业都实现IWorker接口,因此我决定将List<IWorker>注入Scheduler。稍后会有很多种“工作”,现在有两种:CleanerWriterScheduler需要Cleaner的单个实例,因此默认的Singleton Lifestyle就可以了。但我还需要注入一些Writer s取决于某些文件夹中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循环吗? Windsor的Type工厂可以帮忙吗?我需要一些准则。

1 个答案:

答案 0 :(得分:1)

基本上你想要做的就是这些:

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