Castle Windsor:按约定注册,开放泛型
Castle Windsor: Register by convention, open generics
我有这样的界面:
public interface IGenericRepository<T>
我有一个基础 class 像这样:
public abstract class GenericRepository<T> : IGenericRepository<T> where T : class
我有一个 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());
我无法像上面那样解决。给出了什么?
DefaultInterfaces()
仅注册具有匹配名称的接口。
Matching names, means that the implementing class contains in its name
the name of the interface (without the I on the front).
http://docs.castleproject.org/Windsor.Registering-components-by-conventions.ashx
写一个答案,因为这对于评论来说可能太长(而且代码太长)。
给定以下代码:
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>>();
我感觉我们缺少一些关于 classes 注册的信息。
编辑:在提议的代码中,抽象基础 class 显然充当了确定基础服务是什么的权宜之计。如果您使用以下注册,则解决方案有效:
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>
我有这样的界面:
public interface IGenericRepository<T>
我有一个基础 class 像这样:
public abstract class GenericRepository<T> : IGenericRepository<T> where T : class
我有一个 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());
我无法像上面那样解决。给出了什么?
DefaultInterfaces()
仅注册具有匹配名称的接口。
Matching names, means that the implementing class contains in its name the name of the interface (without the I on the front).
http://docs.castleproject.org/Windsor.Registering-components-by-conventions.ashx
写一个答案,因为这对于评论来说可能太长(而且代码太长)。
给定以下代码:
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>>();
我感觉我们缺少一些关于 classes 注册的信息。
编辑:在提议的代码中,抽象基础 class 显然充当了确定基础服务是什么的权宜之计。如果您使用以下注册,则解决方案有效:
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>