Внедрение открытого универсального интерфейса с неуниверсальной реализацией с использованием Castle - PullRequest
2 голосов
/ 01 июня 2011

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

Допустим, у меня есть следующееinterface

public interface IMyInterface<T>
{
    bool DoSomething(T param);
}

И затем у меня есть следующий класс, который реализует этот интерфейс следующим образом:

public class MyClass : IMyInterface<string>
{
    public bool DoSomething(string param)
    {
        // Do Something
        return true;
    }
}

Я хочу иметь возможность разрешить интерфейс, используя замок таким образом, чтобы injectedObjectстановится экземпляром MyClass.

WindsorContainer container = new WindsorContainer(new XmlInterpreter(newConfigResource("castle")));
IMyInterface<string> injectedObject = container.Resolve<IMyInterface<string>>();

Возможно ли это, или я немного сбился с пути?Если это возможно, как мне настроить раздел конфигурации замка?Я попытался использовать нотацию '1, чтобы указать, что интерфейс является открытым универсальным типом, но вы получаете ошибку, если реализация не является также универсальной, что в данном случае не является.

Любая помощь приветствуется

1 Ответ

4 голосов
/ 01 июня 2011

Мы используем свободный интерфейс в моей команде, так что прошло много времени с тех пор, как я посмотрел синтаксис файла конфигурации.Основной принцип таков: ваш сервис - IMyInterface<string>, а тип реализации - MyClass.Поэтому я думаю, что это будет примерно так:

<component service="Namespace.IMyInterface`1[[System.String, mscorlib]], AssemblyName"
        type="Namespace.MyClass, AssemblyName" />

Вы говорите, что получили ошибку.В чем ошибка?Я полагаю, это потому, что вы определили службу как IMyInterface<> без указания параметра типа.Если вы хотите сделать это, как предполагает ваш вопрос, тип реализации также должен быть универсальным:

<component service="Namespace.IMyInterface`1, AssemblyName"
        type="Namespace.MyGenericClass`1, AssemblyName" />

Обратите внимание, что вы можете зарегистрировать оба компонента.Если вы сделаете это, разрешение IMyInterface<string> даст вам экземпляр MyClass, а решение IMyInterface<AnyOtherType> даст вам экземпляр MyGenericClass<AnyOtherType>.

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