不能按惯例注册温莎城堡的组件

本文关键字:城堡 组件 不能按 按惯例 注册 不能 | 更新日期: 2023-09-27 17:50:57

我似乎不能按照惯例注册我的温莎城堡物品,我真的很困惑。情况是我有两个项目,网站(一个真正基本的web表单项目)和BusinessObjects(一个类库)。我正在尝试使用IoC来使我所有的业务对象实现保持在内部,并且只处理web项目中的接口。

我发现完成这个的最好方法是使用安装程序。因此,在global。asax。cs中,我有这个:

private IWindsorContainer _container;
public override void Init()
{
    base.Init();
    InitializeIoC();
    Global.WindsorContainer = _container;
}
private void InitializeIoC()
{
    _container = new WindsorContainer();
    _container.Install(new BusinessObjectsInstaller());
}
public static IWindsorContainer WindsorContainer { get; private set; }

这似乎工作得很好,并将对象拉出容器,我只是使用一个非常简单的:

var thingey = Global.WindsorContainer.Resolve<IThingey>();

然后在我的BusinessObjects项目中,我有这个:

public class BusinessObjectsInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Component.For<IThingey>().ImplementedBy<Thingey>());
    }
}
现在,在这一点上,一切都按照我的期望进行。它并不优雅,但我仍在努力掌握它。因此,在这一点上,我试图完成的一件大事是以更有用的方式将这些对象连接起来,这导致我将上面的组件注册替换为以下内容:

container.Register(Classes
        .FromThisAssembly()
        .BasedOn<IThingey>()
        .LifestyleTransient()
        );

我绝对不能去工作。我得到的只有

没有支持该服务的组件BusinessObjects.Contracts.IThingey was found

最终,类注册将被更改为其他接口继承的另一个接口,但是一次一步。

如果你能帮我弄清楚发生了什么/我做错了什么,我将不胜感激。

不能按惯例注册温莎城堡的组件

您没有指定任何由您的类注册的服务,因此在默认情况下,这些类被注册为它们自己的服务。来自文档:

默认情况下,组件的服务是类型本身

你必须指定组件是针对哪些服务注册的;您可以使用WithService属性或快捷函数(WithServiceBase(), WithServiceDefaultInterfaces()等)来完成此操作。链接的资源包含您可以使用的不同选择方法:

    <
  • 基地/gh>
  • DefaultInterfaces
  • FromInterface
  • AllInterfaces
  • 自我
  • 选择

Krzysztof Kozmic建议您使用Base服务注册您的组件,您可以这样做:

container.Register(Classes
    .FromThisAssembly()
    .BasedOn<IThingey>()
    .WithServiceBase()
    .LifestyleTransient()
    );