我选择Castle.Windsor作为我的应用程序的IoC容器。这是我的第一个IoC expirience,所以我需要一个配置它的建议。
该应用的根类为Scheduler
。它计划并执行不同类型的“工作”。每个作业都实现IWorker
接口,因此我决定将List<IWorker>
注入Scheduler
。稍后会有很多种“工作”,现在有两种:Cleaner
和Writer
。 Scheduler
需要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工厂可以帮忙吗?我需要一些准则。
答案 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