Inversion of control 温莎城堡,超越常规注册组件

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

我刚开始使用Castle Windsor(
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实现也有助于将容器初始化与其他应用程序初始化任务分离。