我的界面是一个单独的项目,我猜我在温莎注册我的服务等时必须做一些特别的事。
我得到的错误是:
Type ABC.Interfaces.Services.IUserService is abstract.
As such, it is not possible to instansiate it as implementation of service ABC.Interfaces.Services.IUserService.
我的安装程序:
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
AllTypes.FromAssemblyContaining<UserService>()
.BasedOn<IUserService>()
.Where(type => type.Name.EndsWith("Service"))
.WithService.DefaultInterface()
.Configure(c => c.LifeStyle.Singleton));
}
container.Register(
AllTypes.FromAssemblyContaining<UserRepository>()
.BasedOn<IUserRepository>()
.Where(type => type.Name.EndsWith("Repository"))
.WithService.DefaultInterface()
.Configure(c => c.LifeStyle.PerWebRequest)
);
我收到了错误,然后我添加了.BasedOn<....>()
子句,因为我认为它与我的接口在一个单独的项目(以及汇编)中作为实际的实现。
我是否必须告诉castle该接口的程序集? 或者是其他问题?
更新II
我的代码:
public class HomeController : Controller
{
private IUserService _userService;
public HomeController(IUserService userService)
{
this._userService = userService;
}
}
在服务组装中:
public class UserService : IUserService
{
private IUserRepository _repository;
public UserService(IUserRepository repository)
{
this._repository = repository;
}
public void Create(IUser user)
{
_repository.Create(user);
}
public IUser Get(int id)
{
return _repository.Get(id);
}
}
在接口程序集中:
public interface IUserService
{
void Create(IUser user);
IUser Get(int id);
}
答案 0 :(得分:1)
问题在于BasedOn, Where, and Pick do logical or
所以这段代码:
AllTypes.FromAssemblyContaining<UserService>()
.BasedOn<IUserService>()
.Where(type => type.Name.EndsWith("Service"))
将选择基于IUserService
的所有类型,或以Service
结尾。类型IUserService
以Service
结尾,因此会选择进行注册。
要解决此问题,您可以删除EndsWith("Service")
过滤。反正可能没有必要。或者您可以删除BasedOn
过滤器,并将类似的逻辑移到Where
子句:
AllTypes.FromAssemblyContaining<UserService>()
.Where(type => type.Name.EndsWith("Service")
&& typeof(IUserService).IsAssignableFrom(type))
.WithService.DefaultInterface()
.Configure(c => c.LifeStyle.Singleton)
另外,你说这些类型在不同的程序集中,但似乎你在某种程度上抓住了IUserService
所在的程序集中的类型。
查看this question for a way to debug which services are getting registered by your code.
答案 1 :(得分:0)
在我的情况下,我得到了同样的错误, 但我忘了添加wcf设施。
container.AddFacility<WcfFacility>();