接口作为实现在不同的项目中,可能没有正确地连接起来
本文关键字:起来 连接 正确地 项目 实现 接口 | 更新日期: 2023-09-27 18:08:47
我的接口在一个单独的项目中,我猜当我在windsor注册我的服务等时,我必须做一些特别的事情。
我得到的错误是: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这个接口的组装吗?还是有别的问题?
更新二
我代码: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);
}
问题是BasedOn, Where和Pick做逻辑或
所以这个代码:
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
所在的程序集中抓取类型。
查看这个问题,了解调试代码中注册了哪些服务的方法。
在我的情况下,我得到同样的错误,但是我忘了添加wcf功能。
container.AddFacility<WcfFacility>();