Вы должны использовать перегрузку действия провайдера, почти так же, как во втором сценарии (что по иронии судьбы не нужно для этого).
services.AddScoped<IUPCCodeGenerator>(p =>
{
// `p` is a scoped instance of `IServiceProvider`, meaning you can pull services from it
var persistence = p.GetRequiredService<IPersistence>();
return new GCCUPCCodeGenerator(persistence, "prefix");
});
ПрефиксКонечно, это может быть из вашей конфигурации.
Не относится к вашему вопросу, но, поскольку я упомянул, что вам не нужно делать это для вашего IUnixDataStore
.Если в вашем конфиге используются разделы (что и должно быть, поскольку наличие в корне множества несвязанных настроек конфигурации может привести к путанице и ошибкам), вы можете связать раздел для UnixConnectionOptions
через строго типизированный конфиг.Предполагая, что конфигурация выглядит следующим образом:
{
"UnixConnection": {
"DBPort": "...",
"SSHUserName": "...",
...
}
}
(Примечание: если вы используете что-то вроде переменных среды, вы можете «разделить», используя :
, то есть UnixConnection:DBPort
)
Тогда:
services.Configure<UnixConnectionOption>(Configuration.GetSection("UnixConnection"));
После этого у вас есть несколько вариантов.Если вы не против ввести IOptions<UnixConnectionOption>
или IOptionsSnapshot<UnixConnectionOption>
, тогда все готово.Это на самом деле имеет преимущество, поскольку вы можете воспользоваться такими вещами, как перезагрузка конфигурации.
Если вы действительно хотите придерживаться непосредственного введения UnixConnectionOptions
, то вам просто нужно добавить еще одну строку, например:
services.AddScoped<UnixConnectionOptions>(p =>
p.GetRequiredService<IOptions<UnixConnectionOptions>>().Value);
services.AddScoped<IUnixDataStore, UnixConnection>();
Поскольку требуемая зависимость находится непосредственно в коллекции сервисов, ее можно внедрить напрямую, без необходимости предоставления настраиваемого действия.Или вы можете придерживаться того, как вы это делаете в настоящее время, но, по крайней мере, воспользоваться сокращенным кодом:
services.AddScoped<IUnixDataStore>(p => {
var connectionParam = p.GetRequiredService<IOptions<UnixConnectionOption>>();
return new UnixConnection(connectionParam.Value);
);