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

Я использую dryloc и хочу зарегистрировать службу, которая задана как неявный тип и может иметь конструктор (а может и не иметь) с более чем одним параметром примитивных типов, таких как string или int

Я пробовал следующее


var container = new Container();

Type serviceType; // some service type
Type serviceKey; // some serviceKey
var param1 = "some param1";
var param2 = "some param2";

container.Register(serviceType, Reuse.ScopedTo(serviceKey: serviceKey), 
    made: Parameters.Of.Type(_=> param1));

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

Есть ли способ реализовать этот сценарий?

Обновлять

Я решил эту проблему, используя дочерние области.

Некоторые пояснения

  • Мой первоначальный пример был не совсем правильным. На самом деле параметры имеют разные типы, поэтому нет двусмысленности.

  • ServiceType может иметь конструктор, который требует param1 и param2, или может иметь конструктор, который их не требует.

var container = new Container();

Type serviceType; // some service type
Type serviceKey; // some serviceKey
var param1 = "some param1";
var param2 = 5;

container.Register(serviceType, Reuse.ScopedTo(serviceKey: serviceKey));

////

// parent scope which is created outside
IResolverContext context; 


object service = null;

using (var scope = context.OpenScope("my-child-scope"))
{
   scope.UseInstance(param1);
   scope.UseInstance(param2);

   service = scope.Resolve(serviceType);
}


person hongkilldong    schedule 10.10.2019    source источник
comment
Могу я спросить, что вы тогда хотите делать? Если вы знаете только тип параметров, а не их имена, как вы вообще узнаете, какие значения должны быть введены? Забудьте о DryIoc и его возможностях или ограничениях, опишите, пожалуйста, свой мыслительный процесс о том, как это может работать.   -  person Lasse V. Karlsen    schedule 17.10.2019
comment
Хорошее примечание. Я обновил описание, которое более точно показывает, чего я хочу достичь   -  person hongkilldong    schedule 22.10.2019


Ответы (1)


Либо используйте параметр по имени: Parameters.Of.Name(x, ...).Name(y, ...)

Или полномасштабный Made.Of, который принимает примитивные константы (или любое значение через Arg.Index):

Made.Of(() => new Blah(param1, param2, Arg.Of<RemainingParamTypeToInject>()))

Обновление: полный пример

using System;
using DryIoc;

public class Program
{
    public static void Main()
    {
        var container = new Container();

        // variant 1
        container.RegisterInstance("1", serviceKey: "x");
        container.RegisterInstance("2", serviceKey: "y");
        container.Register<A>(made: Parameters.Of.Name("x", serviceKey: "x").Name("y", serviceKey: "y"));

        // variant 2
        //container.Register<A>(made: Parameters.Of.Name("x", _ => "1").Name("y", _ => "2"));

        var a = container.Resolve<A>();

        Console.WriteLine(a.X + ", " + a.Y);
    }

    public class A 
    {
        public string X, Y;
        public A(string x, string y) 
        {
            X = x;
            Y = y;
        }
    }
}
person dadhi    schedule 10.10.2019
comment
Проблема в том, что Бла недоступен. У меня только typeof (Бла) - person hongkilldong; 10.10.2019
comment
Затем используйте .Of.Name. В любом случае это так же небезопасно, как и использование позиции - измените ее, и она сломается. - person dadhi; 11.10.2019
comment
Вот пример с Name.Of dotnetfiddle.net/kRKji3 - person dadhi; 17.10.2019