Простой инжектор, как зарегистрировать / разрешить сбор синглетонов на одном интерфейсе - PullRequest
0 голосов
/ 12 октября 2018

Итак, у меня есть этот класс, который я хотел бы зарегистрировать для нескольких синглетов, где я хотел бы различать их (после разрешения из контейнера), используя свойство "ExchangeName"

public interface IGlobalExchangeRateLimitProvider
{
    void DoSomethingWithDb();
    string ExchangeName { get; }
}

public class GlobalExchangeRateLimitProvider : IGlobalExchangeRateLimitProvider
{
    private object _syncLock = new object();

    public GlobalExchangeRateLimitProvider(string exchangeName)
    {
        ExchangeName = exchangeName;
    }

    public void DoSomethingWithDb()
    {
        lock (_syncLock)
        {

        }
    }

    public string ExchangeName { get; }
}

И эточто у меня есть в простом инжекторе для регистрации коллекции

var container = new Container();
container.Collection.Register(new[]
{
    Lifestyle.Singleton.CreateRegistration<IGlobalExchangeRateLimitProvider>(
        () => new GlobalExchangeRateLimitProvider("A"), container),
    Lifestyle.Singleton.CreateRegistration<IGlobalExchangeRateLimitProvider>(
        () => new GlobalExchangeRateLimitProvider("B"), container)
});
container.Verify();

Это все выглядит круто

Но когда я пытаюсь разрешить коллекцию вот так

var globalExchangeRateLimitProviders =
    container.GetAllInstances<IGlobalExchangeRateLimitProvider>();

я получаюследующая ошибка

enter image description here

Нет регистрации для типа IEnumerableможет быть найден.

Я имею в виду, я могу догадаться, почему это так, потому что то, что я сейчас зарегистрировал, это IEnumerable<Registration> не IEnumerable<IGlobalExchangeRateLimitProvider>

НоЯ просто не уверен, как подключить SimpleInjector, чтобы дать мне то, что я хочу здесь.Что мне нужно сделать, чтобы зарегистрировать вышеуказанное и получить IEnumerable<IGlobalExchangeRateLimitProvider> из контейнера?

Как этого добиться с помощью SimpleInjector?

1 Ответ

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

Вы вызываете неправильную Register<T> перегрузку.Вы на самом деле звоните Register<T>(params T[] singletons), а не Register<T>(IEnumerable<Registration> registrations).Это приводит к тому, что регистрации выполняются в виде набора Registration экземпляров вместо набора IGlobalExchangeRateLimitProvider экземпляров, что можно увидеть при наведении курсора на проверенный контейнер:

Simple Injector's debug view showing the root registrations

Вместо этого включите тип коллекции при вызове Collection.Register

var container = new Container();
container.Collection.Register<IGlobalExchangeRateLimitProvider>(new[]
    {
        Lifestyle.Singleton.CreateRegistration<IGlobalExchangeRateLimitProvider>(
            () => new GlobalExchangeRateLimitProvider("A"), container),
        Lifestyle.Singleton.CreateRegistration<IGlobalExchangeRateLimitProvider>(
            () => new GlobalExchangeRateLimitProvider("B"), container)
    });
container.Verify();
...