我有以下课程。
public interface ICampaignDal : ICrudDal<Campaign>
{
}
public class CampaignDal : BaseDal<Campaign>, ICampaignDal
{
}
public interface IPixelDal : ICrudDal<Pixel>
{
}
public class PixelDal : BaseDal<Pixel>, IPixelDal
{
}
public interface ICrudDal<T> where T : BaseEntity, new()
{
}
这是我注册的方式:
Container.Register(
Types.FromAssembly(typeof (ICrudDal<>).Assembly)
.BasedOn(typeof (ICrudDal<>)).WithServiceAllInterfaces());
当我解决这个问题时,它可以正常工作:
Container.Resolve<ICampaignDal>();
但是这个:
Container.Resolve<IPixelDal>();
会产生错误:
"Type DataAccessLayer.IPixelDal is abstract.\r\n As such, it is not possible to instansiate it as implementation of service 'DataAccessLayer.IPixelDal'. Did you forget to proxy it?"
答案 0 :(得分:4)
我使用以下代码检查了容器配置(灵感来自this answer):
foreach (var handler in c.Kernel.GetAssignableHandlers(typeof(object)))
Console.WriteLine("{0} implemented by: {1}",
String.Join(",", handler.ComponentModel.Services) ,
handler.ComponentModel.Implementation);
上述代码的输出是:
ConsoleApp.ICampaignDal,ConsoleApp.ICrudDal`1[ConsoleApp.Campaign] implemented by: ConsoleApp.CampaignDal
ConsoleApp.ICampaignDal,ConsoleApp.ICrudDal`1[ConsoleApp.Campaign] implemented by: ConsoleApp.ICampaignDal
ConsoleApp.ICrudDal`1[T] implemented by: ConsoleApp.ICrudDal`1[T]
ConsoleApp.ICrudDal`1[ConsoleApp.Pixel],ConsoleApp.IPixelDal implemented by: ConsoleApp.IPixelDal
ConsoleApp.ICrudDal`1[ConsoleApp.Pixel],ConsoleApp.IPixelDal implemented by: ConsoleApp.PixelDal
如您所见,IPixelDal
有两个注册(最后两行)。默认注册(两者中的第一个)表示IPixelDal
是由它自己实现的。考虑到这是一个抽象类型(接口),不可能实例化它,事实由您获得的错误消息确认。
我对您的代码做了一个简单的调整,它运行正常:
Container.Register(
Types.FromAssembly(typeof(ICrudDal<>).Assembly)
.BasedOn(typeof(ICrudDal<>))
.Unless(t => t.IsAbstract)
.WithServiceAllInterfaces());
.Unless(t => t.IsAbstract)
行指示容器仅自动注册具体类型。
免责声明:我不是Castle Windsor的用户,所以我不确定这是否是惯用的解决方案。但如果您需要快速修复,它确实有效。
答案 1 :(得分:3)
使用Classes.
而不是Types.
来获取具体的课程