C# Can';t按惯例注册温莎城堡组件
我似乎无法按照惯例注册我的温莎城堡的物品,我真的不知所措。情况是我有两个项目,Website(一个非常基本的web表单项目)和BusinessObjects(一个类库)。我试图使用IoC使我的所有业务对象实现都保持在内部,并且只处理网站项目中的接口 我发现实现这一点的最好方法是使用安装程序。因此,在我的Global.asax.cs中,我有:C# Can';t按惯例注册温莎城堡组件,c#,castle-windsor,C#,Castle Windsor,我似乎无法按照惯例注册我的温莎城堡的物品,我真的不知所措。情况是我有两个项目,Website(一个非常基本的web表单项目)和BusinessObjects(一个类库)。我试图使用IoC使我的所有业务对象实现都保持在内部,并且只处理网站项目中的接口 我发现实现这一点的最好方法是使用安装程序。因此,在我的Global.asax.cs中,我有: private IWindsorContainer _container; public override void Init() { base.
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()
,等等)来实现这一点。链接资源包含您可以使用的不同选择方法:
container.Register(Classes
.FromThisAssembly()
.BasedOn<IThingey>()
.WithServiceBase()
.LifestyleTransient()
);
container.Register(类)
.FromThisAssembly()中的
.BasedOn()
.WithServiceBase()
.生活方式
);
@KrzysztofKozmic我知道这样更快,但是你可以用真实的答案而不是评论:)太棒了,谢谢你的链接。我最终选择了。使用ServiceFromInterface()
,因为拥有一个标记接口(显然这就是它们的名称)是最终目标。我还注意到在那一页上。includeincludeNoPublicTypes()
,这也是必要的,因为我的实现是内部的。我会+1答案。。。但是我还不能,还没有足够的代表:\@zeonic并不重要,如果其他观众觉得这个问题和答案有趣的话,他们很有希望获得更多的选票