接口作为实现在不同的项目中,可能没有正确地连接起来

本文关键字:起来 连接 正确地 项目 实现 接口 | 更新日期: 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);
}

接口作为实现在不同的项目中,可能没有正确地连接起来

问题是BasedOnWherePick做逻辑

所以这个代码:

AllTypes.FromAssemblyContaining<UserService>()
    .BasedOn<IUserService>()
    .Where(type => type.Name.EndsWith("Service"))

将选择基于IUserService或以Service结尾的所有类型。类型IUserServiceService结尾,因此它被选中进行注册。

要解决这个问题,您可以删除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>();