SimpleInjector: зарегистрировать коллекцию через адаптер - PullRequest
1 голос
/ 28 мая 2019

С помощью SimpleInjector вы можете зарегистрировать коллекцию типов:

interface ILogger { }
class FileLogger : ILogger { }
class SqlLogger : ILogger { }

// usage
var container = new Container();
container.Collection.Register<ILogger>(typeof(FileLogger), typeof(SqlLogger));
container.GetAllInstances<ILogger>(); // returns both ILoggers

Имея это в виду, я хочу обернуть такие ILogger s абстракцией MyLogger, которые я могу использовать в своем приложении:

interface MyLogger {
}

class LoggerAdapter : MyLogger {
    public LoggerAdapter(ILogger logger) { }
}

Однако я не могу заставить контейнер зарегистрировать адаптер регистратора как коллекцию поверх зарегистрированной коллекции ILogger s:

var container = new Container();
container.Collection.Register<ILogger>(typeof(FileLogger), typeof(SqlLogger));
container.Collection.Register<MyLogger>(typeof(ILogger));
// ArgumentException: The supplied type ILogger does not inherit from MyLogger.
// Parameter name: serviceTypes

Хотя сообщение об исключении ясно (ILogger не наследуется от LoggerAdapter), я чувствую, что SimpleInjector должен иметь возможность сделать LoggerAdapter s из ILogger s, просто введя эти ILogger s в LoggerAdapter s.

Есть ли чистый способ зарегистрировать коллекцию таких адаптеров?

1 Ответ

1 голос
/ 28 мая 2019

Здесь есть несколько решений.Первое, что приходит мне в голову, это изменить свой адаптер, чтобы он вместо этого принимал список регистраторов:

class LoggerAdapter : MyLogger
{
    public LoggerAdapter(IEnumerable<ILogger> loggers) { }
}

Это, вероятно, более приятное решение, так как позволяет вам вводить по одному MyLogger в вашпотребителям вместо этого нужно внедрить коллекцию из MyLogger экземпляров.

Если вам действительно нужен список MyLogger с, вы можете зарегистрировать коллекцию вручную следующим образом:

container.RegisterSingleton<IEnumerable<MyLogger>>(
    () => container.GetAllInstances<ILogger>().Select(logger => new LoggerAdapter(logger)));
...