我有这样的界面:
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());
我不能像上面那样解决。是什么给了什么?
答案 0 :(得分:3)
immutable Point{T}
x::T
y::T
end
仅注册具有匹配名称的接口。
匹配名称,表示实现类在其名称中包含 接口的名称(前面没有I)。
http://docs.castleproject.org/Windsor.Registering-components-by-conventions.ashx
答案 1 :(得分: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>