C# Can';t按惯例注册温莎城堡组件

C# Can';t按惯例注册温莎城堡组件,c#,castle-windsor,C#,Castle Windsor,我似乎无法按照惯例注册我的温莎城堡的物品,我真的不知所措。情况是我有两个项目,Website(一个非常基本的web表单项目)和BusinessObjects(一个类库)。我试图使用IoC使我的所有业务对象实现都保持在内部,并且只处理网站项目中的接口 我发现实现这一点的最好方法是使用安装程序。因此,在我的Global.asax.cs中,我有: private IWindsorContainer _container; public override void Init() { base.

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

我发现实现这一点的最好方法是使用安装程序。因此,在我的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; }
public class BusinessObjectsInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Component.For<IThingey>().ImplementedBy<Thingey>());
    }
}
这似乎工作得很好,为了从容器中拉出一个物体,我使用了一个非常简单的方法:

var thingey = Global.WindsorContainer.Resolve<IThingey>();
var thingey=Global.WindsorContainer.Resolve();
在我的BusinessObjects项目中,我有:

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; }
public class BusinessObjectsInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Component.For<IThingey>().ImplementedBy<Thingey>());
    }
}
公共类BusinessObjectsInstaller:IWindsorInstaller
{
public void安装(IWindsorContainer、IConfigurationStore)
{
container.Register(Component.For().ImplementedBy());
}
}
现在,在这一点上,一切都按照我的预期进行。这不是很优雅什么的,但我仍在努力解决这个问题。因此,在这一点上,我试图完成的一件大事是以一种更有用的方式将这些对象连接起来,这导致我将上面的组件注册替换为以下内容:

container.Register(Classes
        .FromThisAssembly()
        .BasedOn<IThingey>()
        .LifestyleTransient()
        );
container.Register(类)
.FromThisAssembly()中的
.BasedOn()
.生活方式
);
我绝对不能去工作。我得到的只是

没有支持服务的组件 已找到BusinessObjects.Contracts.i文件夹

最终,类注册将更改为其他接口继承的另一个接口,但每次只执行一步


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

您没有指定任何由类注册的服务,因此默认情况下,类将作为服务注册到它们自己。从文件中:

您必须指定组件注册所针对的服务;您可以使用
WithService
属性或快捷方式函数(
WithServiceBase()
WithServiceDefaultInterfaces()
,等等)来实现这一点。链接资源包含您可以使用的不同选择方法:

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

container.Register(Classes
    .FromThisAssembly()
    .BasedOn<IThingey>()
    .WithServiceBase()
    .LifestyleTransient()
    );
container.Register(类)
.FromThisAssembly()中的
.BasedOn()
.WithServiceBase()
.生活方式
);

@KrzysztofKozmic我知道这样更快,但是你可以用真实的答案而不是评论:)太棒了,谢谢你的链接。我最终选择了
。使用ServiceFromInterface()
,因为拥有一个标记接口(显然这就是它们的名称)是最终目标。我还注意到在那一页上
。includeincludeNoPublicTypes()
,这也是必要的,因为我的实现是内部的。我会+1答案。。。但是我还不能,还没有足够的代表:\@zeonic并不重要,如果其他观众觉得这个问题和答案有趣的话,他们很有希望获得更多的选票