接口在不同的项目中作为实现,城堡没有正确启动

时间:2011-09-17 15:29:46

标签: c# nhibernate castle-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该接口的程序集? 或者是其他问题?

更新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);
}

2 个答案:

答案 0 :(得分:1)

问题在于BasedOn, Where, and Pick do logical or

所以这段代码:

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所在的程序集中的类型。

查看this question for a way to debug which services are getting registered by your code.

答案 1 :(得分:0)

在我的情况下,我得到了同样的错误, 但我忘了添加wcf设施。

container.AddFacility<WcfFacility>();