Inversion of control 温莎城堡,超越常规注册组件
我刚开始使用Castle Windsor(Inversion of control 温莎城堡,超越常规注册组件,inversion-of-control,castle-windsor,castle-windsor-3,Inversion Of Control,Castle Windsor,Castle Windsor 3,我刚开始使用Castle Windsor(3.3.0),这是我第一次使用Castle Windsor,我被基于约定的注册卡住了 我想按名称约定尽可能多地注册(IDummyService->DummyService): var容器=新的WindsorContainer(); container.Register(Types.fromthissembly().Pick().WithServiceDefaultInterfaces()); container.Register(Component.Fo
3.3.0
),这是我第一次使用Castle Windsor,我被基于约定的注册卡住了
我想按名称约定尽可能多地注册(IDummyService
->DummyService
):
var容器=新的WindsorContainer();
container.Register(Types.fromthissembly().Pick().WithServiceDefaultInterfaces());
container.Register(Component.For().ImplementedBy().LifestyleSingleton());//这么久了,我在这里扔。。。
。。。当然,我们可以稍微更改一些刚刚注册的组件(更改生命周期管理、构造函数参数等)
因为我希望注册尽可能简单,所以我希望避免复杂的情况。我找到的唯一解决方案很简单-将自定义内容移到名称约定之上:
var container = new WindsorContainer();
container.Register(Component.For<IDummyService>().ImplementedBy<DummyService>().LifestyleSingleton()); // Do custom stuff first...
container.Register(Types.FromThisAssembly().Pick().WithServiceDefaultInterfaces()); // And convention at the end...
var容器=新的WindsorContainer();
container.Register(Component.For().ImplementedBy().LifestyleSingleton());//先做定制的东西。。。
container.Register(Types.fromthissembly().Pick().WithServiceDefaultInterfaces());//最后的约定。。。
我现在的问题是,这是解决我的注册问题的正确方法吗?我可以看出温莎城堡在这一领域相当强大,我宁愿妥善解决我的任务,遗憾的是,我们没有看到太多的实际示例。一个选项是通过实现
IContributeComponentModelConstruction
接口进行自定义配置-为每个组件调用ProcessModel
方法:
public class ExtraConfiguration : IContributeComponentModelConstruction
{
public void ProcessModel(IKernel kernel, ComponentModel model)
{
if (model.Implementation == typeof(DummyService))
{
model.LifestyleType = LifestyleType.Singleton;
}
if ...
}
}
然后,您需要在注册其他组件之前向容器注册此组件:
container.Kernel.ComponentModelBuilder.AddContributor(new ExtraConfiguration());
一个选项是通过实现
IContributeComponentModelConstruction
接口进行自定义配置-为每个组件调用ProcessModel
方法:
public class ExtraConfiguration : IContributeComponentModelConstruction
{
public void ProcessModel(IKernel kernel, ComponentModel model)
{
if (model.Implementation == typeof(DummyService))
{
model.LifestyleType = LifestyleType.Singleton;
}
if ...
}
}
然后,您需要在注册其他组件之前向容器注册此组件:
container.Kernel.ComponentModelBuilder.AddContributor(new ExtraConfiguration());
一个选项是通过实现
IContributeComponentModelConstruction
接口进行自定义配置-为每个组件调用ProcessModel
方法:
public class ExtraConfiguration : IContributeComponentModelConstruction
{
public void ProcessModel(IKernel kernel, ComponentModel model)
{
if (model.Implementation == typeof(DummyService))
{
model.LifestyleType = LifestyleType.Singleton;
}
if ...
}
}
然后,您需要在注册其他组件之前向容器注册此组件:
container.Kernel.ComponentModelBuilder.AddContributor(new ExtraConfiguration());
一个选项是通过实现
IContributeComponentModelConstruction
接口进行自定义配置-为每个组件调用ProcessModel
方法:
public class ExtraConfiguration : IContributeComponentModelConstruction
{
public void ProcessModel(IKernel kernel, ComponentModel model)
{
if (model.Implementation == typeof(DummyService))
{
model.LifestyleType = LifestyleType.Singleton;
}
if ...
}
}
然后,您需要在注册其他组件之前向容器注册此组件:
container.Kernel.ComponentModelBuilder.AddContributor(new ExtraConfiguration());
您的最后一个注册行非常广泛,虽然它可以在一个简单的应用程序中工作,但在大多数实际应用程序中可能过于简单 通常,程序集将提供一组或多组服务。使用各种选择方法(如InNamespace、BasedOn、Where),您可以注册每一组服务并配置它们的生命周期、依赖项、命名等。我倾向于为每一组服务创建一个单独的方法。(例如,
RegisterDataAccessComponents()
)非常明确地说明程序集提供的服务集,这使得以后更容易重新访问代码,找出所提供的内容并跟踪影响运行时行为的配置。您仍然按照约定进行注册,但您的注册更加明确
为此,,我发现,创建负责注册和连接程序集提供的服务集的IWindsorInstaller实现也有助于将容器初始化与其他应用程序初始化任务分离开来。您的上一个注册行非常广泛,虽然它将以简单的方式工作在大多数现实世界的应用程序中,应用程序可能过于简单 通常,程序集将提供一组或多组服务。使用各种选择方法(如InNamespace、BasedOn、Where),您可以注册每一组服务并配置它们的生命周期、依赖项、命名等。我倾向于为每一组服务创建一个单独的方法。(例如,
RegisterDataAccessComponents()
)非常明确地说明程序集提供的服务集,这使得以后更容易重新访问代码,找出所提供的内容并跟踪影响运行时行为的配置。您仍然按照约定进行注册,但您的注册更加明确
为此,,我发现,创建负责注册和连接程序集提供的服务集的IWindsorInstaller实现也有助于将容器初始化与其他应用程序初始化任务分离开来。您的上一个注册行非常广泛,虽然它将以简单的方式工作在大多数现实世界的应用程序中,应用程序可能过于简单 通常,程序集将提供一组或多组服务。使用各种选择方法(如InNamespace、BasedOn、Where),您可以注册每一组服务并配置它们的生命周期、依赖项、命名等。我倾向于为每一组服务创建一个单独的方法。(例如,
RegisterDataAccessComponents()
)非常明确地说明程序集提供的服务集,这使得以后更容易重新访问代码,找出所提供的内容并跟踪影响运行时行为的配置。您仍然按照约定进行注册,但您的注册更加明确
为此,我发现创建负责注册和连接程序集提供的服务集的IWindsorInstaller实现也有助于将容器初始化与其他应用程序初始化任务分离。