Castle.Windsor IoC 容器特定配置
Castle.Windsor IoC-container specific configuration
我选择 Castle.Windsor 作为我的应用程序的 IoC 容器。这是我的第一个 IoC 经验,所以我需要配置它的建议。
应用程序的根 class 是 Scheduler
。它计划和执行不同类型的 "jobs"。每个作业都实现了IWorker
接口,所以我决定在Scheduler
中注入一个List<IWorker>
。以后会有很多种"jobs",现在有两种:Cleaner
和Writer
。 Scheduler
需要 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
我选择 Castle.Windsor 作为我的应用程序的 IoC 容器。这是我的第一个 IoC 经验,所以我需要配置它的建议。
应用程序的根 class 是 Scheduler
。它计划和执行不同类型的 "jobs"。每个作业都实现了IWorker
接口,所以我决定在Scheduler
中注入一个List<IWorker>
。以后会有很多种"jobs",现在有两种:Cleaner
和Writer
。 Scheduler
需要 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