Нужна помощь в настройке Castle-Windsor - PullRequest
1 голос
/ 02 мая 2010

У меня есть эти базовые интерфейсы и провайдеры в одной сборке (Assembly1):

public interface IEntity
{
}

public interface IDao
{
}

public interface IReadDao<T> : IDao
    where T : IEntity
{
    IEnumerable<T> GetAll();
}

public class NHibernate<T> : IReadDao<T>
    where T : IEntity
{
    public IEnumerable<T> GetAll()
    {
        return new List<T>();
    }
}

И у меня есть эта реализация внутри другой сборки (Assembly2):

public class Product : IEntity
{
    public string Code { get; set; }
}

public interface IProductDao : IReadDao<Product> 
{
    IEnumerable<Product> GetByCode(string code);
}

public class ProductDao : NHibernate<Product>, IProductDao
{
    public IEnumerable<Product> GetByCode(string code)
    {
        return new List<Product>();
    }
}

Я хочу иметь возможность получить IRead<Product> и IProductDao из контейнера. Я использую эту регистрацию:

container.Register(
    AllTypes.FromAssemblyNamed("Assembly2")
        .BasedOn(typeof(IReadDao<>)).WithService.FromInterface(),
    AllTypes.FromAssemblyNamed("Assembly1")
        .BasedOn(typeof(IReadDao<>)).WithService.Base());

IReadDao<Product> прекрасно работает. Контейнер дает мне ProductDao. Но если я попытаюсь получить IProductDao, контейнер выдаст ComponentNotFoundException. Как правильно настроить регистрацию?

1 Ответ

3 голосов
/ 03 мая 2010

Попробуйте изменить регистрацию на Assembly2, чтобы использовать все интерфейсы:

AllTypes.FromAssemblyNamed("Assembly2").BasedOn(typeof(IReadDao<>))
  .WithService.Select((t, baseType) => t.GetInterfaces());
...