Разрешить разные экземпляры по атрибуту с помощью Autofac - PullRequest
0 голосов
/ 20 сентября 2019

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

Я знаю, что мы можем зарегистрировать 2различные реализации интерфейса и решить хорошую, используя атрибут.Например:

 ContainerBuilder cb = new ContainerBuilder();

 cb.RegisterType<EnglishHello>().Keyed<IHello>("EN");
 cb.RegisterType<FrenchHello>().Keyed<IHello>("FR");
 cb.RegisterType<HelloConsumer>().WithAttributeFilter();
 var container = cb.Build();

и зависимость будет использоваться следующим образом:

   public class HelloConsumer  { 
         public HelloConsumer([KeyFilter("EN")] IHello helloService)
         {  } 
    }

Все отлично работает с этим первым примером.

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

var helloEn=new Hello();
var helloFr=new Hello();    
//init properties...
helloFr.Greetings="Salut";
helloEn.Greetings="Hi";

cb.Register<Hello>(x=>helloEn).Keyed<IHello>("EN");
cb.Register<Hello>(x=>helloFr).Keyed<IHello>("FR");

, который хорошо компилируется, но во время разрешения класса HelloConsumer параметр конструктора "helloService" равен нулю.

Возможно ли добиться такого поведения с помощью Autofac, или я что-то упустил?

(относится к Autofac именованный инжектор конструктора регистрации , но не та же проблема)

1 Ответ

0 голосов
/ 20 сентября 2019

С ядром .WithAttributeFiltering() расширение.Это, кажется, работает просто отлично.

using System;
using Autofac;
using Autofac.Features.AttributeFilters;

public class Program
{
    public interface IHello
    {
         string Greetings { get; }
    }

    public class Hello : IHello
    {
        public string Greetings
        {
            get;
            set;
        }
    }

    public class HelloConsumer
    {
        public HelloConsumer([KeyFilter("EN")] IHello hello)
        {
            Console.WriteLine(hello.Greetings);
        }
    }

    public static void Main()
    {
        ContainerBuilder cb = new ContainerBuilder();
        cb.RegisterType<HelloConsumer>().AsSelf().WithAttributeFiltering();
        var helloEn = new Hello { Greetings = "Hi" };
        var helloFr = new Hello { Greetings = "Bonjour" };
        cb.Register<Hello>(x => helloEn).Keyed<IHello>("EN");
        cb.Register<Hello>(x => helloFr).Keyed<IHello>("FR");
        var container = cb.Build();

        container.Resolve<HelloConsumer>(); // Should write the correct greeting
    }
}

Fiddle: https://dotnetfiddle.net/3s6oFc

...