Динамически регистрировать типы в замке Виндзор - PullRequest
0 голосов
/ 11 октября 2018

Допустим, у меня есть интерфейс и классы: (для выяснения цели он опустеет)

public interface IPerson { }

public class Tom : IPerson {}
public class Philip : IPerson {}

И интерфейс службы и его реализация:

public interface IHelloService<T> where T : IPerson { }

public class HelloService<T> : IHelloService<T> where T : IPerson { }

Как я могуСервис динамической регистрации HelloService для каждого IProdukt, который я получил, я хочу зарегистрировать следующие классы:

IHelloService<Tom> -> HelloService<Tom>
IHelloService<Philip> -> HelloService<Philip>

1 Ответ

0 голосов
/ 11 октября 2018

Возможно, вам нужно что-то вроде этого:

container.Register(Component.For(typeof(IHelloService<>))
    .ImplementedBy(typeof(HelloService<>), new Only<IProduct>())
    .LifestyleTransient());

public class Only<T> : IGenericServiceStrategy
{
    public bool Supports(Type service, ComponentModel component) => typeof(T).IsAssignableFrom(service.GetGenericArguments()[0]);
}

Это закроет реализацию с тем же аргументом типа, что и служба, но ограничит возможные аргументы типа типами, которые реализуют IProdukt / IPerson(Я предполагаю, что они должны быть одинаковыми?).

См. Описание этой функции здесь: http://kozmic.net/2013/07/23/on-castle-windsor-and-open-generic-components/

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