Передача запрашивающего типа класса в запрашиваемый конструктор класса - PullRequest
0 голосов
/ 07 сентября 2018

Допустим, у меня есть следующий класс:

public class Handler
{
    public Type RequesterType { get; }

    public Handler(Type requesterType)
    {
        RequesterType = requesterType;
    }
}

которая сама является зависимостью другого класса:

public class Controller
{
    public Handler Handler { get; }

    public Controller(Handler handler)
    {
        Handler = handler;
    }
}

Можно ли зарегистрировать Handler таким образом, чтобы при разрешении Controller аргументу конструктора зависимого Handler requesterType присваивался тип Controller?

Вот пример того, чего я хочу достичь:

class Program
{
    static void Main(string[] args)
    {
        var container = new WindsorContainer();
        container.Register(
            Component.For<Controller>()
            //Component.For<Handler>(), <- this is the essense of my question
        );

        var controller = container.Resolve<Controller>();
        Console.WriteLine(controller.Handler.RequesterType); //Should output Program.Controller
        Console.ReadKey();
    }
}

1 Ответ

0 голосов
/ 07 сентября 2018

Обычный способ справиться с этим - сделать универсальный обработчик:

public class Handler<T>
{
    public Type RequesterType { get { return typeof(T) ; }
}

Тогда вместо передачи типа в конструктор вы передадите его как параметр общего типа:

public class Controller
{
    public Handler<Controller> Handler { get; }

    public Controller(Handler<Controller> handler)
    {
        Handler = handler;
    }
}

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

Возможно, вы захотите немного украсить это интерфейсами или ковариацией, но это общая идея.

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