привязка интерфейса‹T› в замке Виндзор

У меня есть общий интерфейс контейнера данных IDataContainer

Я использую его для разных типов T IPerson, ISuperMan и т. д.

В замке я зарегистрировал его с

container.AddComponentWithLifestyle<IDataContainer<IPerson>, DataContainer<Person>>(LifestyleType.Transient);
container.AddComponentWithLifestyle<IDataContainer<ISuperMan>, DataContainer<SuperMan>>(LifestyleType.Transient);

во время выполнения замок создает зависимость, например.

IDataContainer<IPerson> test = container.GetService<IDataContainer<IPerson>>();

но он терпит неудачу с невозможностью приведения... классы реализуют интерфейс, а пространства имен верны и т. д.

Звонок

IPerson test = container.GetService<IPerson>();

Работы (с регистрацией <IPerson,Person>)

Замок не может разрешить interface<T> или ?


person Community    schedule 22.05.2009    source источник
comment
Перефразируйте свой вопрос. Я не понимаю ни слова.   -  person Krzysztof Kozmic    schedule 22.05.2009


Ответы (2)


Так что это уже поздно, но я думаю, что знаю, что вы пытаетесь здесь сделать. Я могу заставить это пройти:

IDataContainer<IPerson> test = container.GetService<IDataContainer<IPerson>>();

Зарегистрировав такие компоненты:

public class IoC
{
    public static void SetUp()
    {
        container = new WindsorContainer();
        container.AddComponent<IPerson, Person>();
        //container.AddComponentWithLifestyle<IDataContainer<IPerson>, DataContainer<Person>>(LifestyleType.Transient);
        //container.AddComponentWithLifestyle<IDataContainer<ISuperMan>, DataContainer<SuperMan>>(LifestyleType.Transient);
        container.AddComponentWithLifestyle("DataContainers", typeof(IDataContainer<>), typeof(DataContainer<>), LifestyleType.Transient);
    }

    public void TestOne()
    {
        SetUp();
        var test = container.GetService<IDataContainer<IPerson>>();
        Assert.That(test, Is.Not.Null);
    }

    public void TestTwo()
    {
        SetUp();
        var test = container.GetService<IPerson>();
        Assert.That(test, Is.Not.Null);
    }
}

internal interface IDataContainer<T> { }
internal class DataContainer<T> : IDataContainer<T> { }

internal interface IPerson { }
class Person : IPerson { }

internal interface ISuperMan { }
class SuperMan : ISuperMan { }

Две закомментированные строки — это две строки, которые существуют в вопросе.

person Chris Missal    schedule 30.08.2009

Это не имеет никакого отношения к Виндзору. Вы получаете ошибку приведения, потому что C# 2.0 и 3.0 не поддерживают ковариантность дженериков. Вероятно, вы делаете DataContainer<T> реализующим IDataContainer<T>, что означает, что DataContainer<Person> реализует IDataContainer<Person>, а не IDataContainer<IPerson>, что вы запрашиваете у контейнера.

person Mauricio Scheffer    schedule 23.05.2009