зарегистрируйте IRepo <T>для 2 реализаций, чтобы разрешить его в зависимости от T (интерфейсы, которые реализует T) - PullRequest
0 голосов
/ 01 апреля 2011

У меня есть что-то вроде этого:

public class IRepo<T>
{
}

public class EntRepo<T> : IRepo<T> where T : Entity
{
}

public classs DelRepo<T> : IRepo<T> where T : Entity, IDel
{
}

как мне зарегистрировать это, чтобы, когда я буду Resolve реализация с T, которая реализует IDel, я бы получил DelRepo, в остальном яполучит EntRepo

Ответы [ 2 ]

2 голосов
/ 01 апреля 2011

Используйте IHandlerSelector ........

1 голос
/ 01 апреля 2011

Вы можете написать декоратор / маршрутизатор, который знает два, какую реализацию направить.Вот пример:

public class RepoRouter<T> : IRepo<T> where T : Entity
{
    private static readonly bool isDelType;
    private readonly IWindsorContainer container;

    static RepoRouter()
    {
        isDelType = typeof(IDel).IsAssignableFrom(typeof(T));
    }

    public RepoRouter(IWindsorContainer container)
    {
        this.container = container;
    }

    // Implement all interface members of IRepo<T> here.
    void IRepo<T>.MyInterfaceMethod(T value)
    {
        this.GetRepo().MyInterfaceMethod(value);
    }

    private IRepo<T> GetRepo()
    {
        return isDelType ?
            this.container.Resolve<DelRepo<T>>() :
            this.container.Resolve<EntRepo<T>>();
    }
}

Теперь вы можете зарегистрировать это RepoRouter<T> в своем контейнере.

...