温莎城堡:按惯例注册,开放式仿制药

时间:2015-06-02 03:31:09

标签: castle-windsor castle-windsor-3

我有这样的界面:

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());

我不能像上面那样解决。是什么给了什么?

2 个答案:

答案 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>