Интерфейсы находятся в другом проекте как реализации, замок не подключен должным образом - PullRequest
0 голосов
/ 17 сентября 2011

Мои интерфейсы находятся в отдельном проекте, и я предполагаю, что мне нужно сделать что-то особенное, когда я регистрирую свои службы и т. Д. В 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<....>(), поскольку полагал, что это связано с тем, что мои интерфейсы находятся в отдельном проекте (и, следовательно, в сборке) в качестве фактической реализации.

Должен ли я сообщить Каслу сборку этого интерфейса? Или проблема в другом?

Обновление 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 ]

1 голос
/ 18 сентября 2011

Проблема в том, что BasedOn , Где и 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.

Проверьте этот вопрос для способа отладки, какие службы регистрируются вашим кодом.

0 голосов
/ 07 августа 2014

В моем случае я получал ту же ошибку, но забыл добавить средство wcf.

container.AddFacility<WcfFacility>();
...