Есть способ зарегистрировать сервис, который задан как неявный тип и имеет конструктор с более чем одним параметром примитивного типа. - PullRequest
1 голос
/ 10 октября 2019

Я использую 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, я могу указать только один параметр типа примитива, который будет введен в конструктор службы, но не более. Я не могу использовать фабричный делегат и другие подобные подходы, так как я не знаю деталей о типе сервиса.

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

Обновление

Iрешили эту проблему с помощью дочерних областей.

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

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

  • 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);
}

1 Ответ

1 голос
/ 10 октября 2019

Либо используйте параметр по имени: 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...