2

我有一个这样的界面:

public interface IGenericRepository<T>

我有一个像这样的基类:

public abstract class GenericRepository<T> : IGenericRepository<T> where T : class

我有这样的课:

public class AGenericRepository<T> : GenericRepository<T> where T : class

没有约定,我成功注册如下:

container.Register(
    Component.For(typeof(GenericRepository<>)).ImplementedBy(typeof(AGenericRepository<>))
);

我可以像这样成功地解析一个对象:

var robot = container.Resolve<GenericRepository<Android>>();

但是,当尝试像这样按约定注册时:

container.Register(Classes.FromThisAssembly()
                            .BasedOn(typeof(GenericRepository<>))
                            .WithService.Base());

我无法像上面那样解决。是什么赋予了?

4

2 回答 2

3

DefaultInterfaces()仅注册具有匹配名称的接口。

匹配名称,意味着实现类在其名称中包含接口的名称(前面没有 I)。

http://docs.castleproject.org/Windsor.Registering-components-by-conventions.ashx

于 2015-06-02T03:59:58.733 回答
3

写一个答案,因为这对于评论来说可能太长(而且代码太长)。

给定以下代码:

public interface IGenericRepository<T> {}
public abstract class GenericRepository<T> : IGenericRepository<T> where T : class {}
public class AGenericRepository<T> : GenericRepository<T> where T : class {}
public class AInstance: AGenericRepository<string>{} 

这个注册对我来说很好:

var container = new WindsorContainer();
container.Register(Classes.FromThisAssembly().BasedOn(typeof (GenericRepository<>)).WithServiceBase());
var result = container.Resolve<GenericRepository<string>>();

我有一种感觉,我们缺少一些关于注册了哪些课程的信息。


编辑:在提议的代码中,抽象基类显然充当了确定基本服务是什么的权宜之计。如果您使用以下注册,则该解决方案有效:

var container = new WindsorContainer();
container.Register(Classes.FromThisAssembly().BasedOn(typeof (GenericRepository<>)).WithServiceAllInterfaces());
var result = container.Resolve<IGenericRepository<string>>();

但是,针对 的解决方案GenericRepository似乎不起作用,因为它没有在城堡中注册为解决方案组件。如果你想自己注册组件,你可以直接描述它:

var container = new WindsorContainer();
container.Register(Classes.FromThisAssembly().BasedOn(typeof (GenericRepository<>)).WithServices(typeof(GenericRepository<>)));
var result = container.Resolve<GenericRepository<string>>();
// result is AGenericRepository<string>
于 2015-06-02T07:07:26.500 回答