интерфейс <T>привязка в замке Виндзор - PullRequest
1 голос
/ 22 мая 2009

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

Я использую его для разных типов Т 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> или?

Ответы [ 2 ]

2 голосов
/ 31 августа 2009

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

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 { }

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

0 голосов
/ 23 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...