Могу ли я с помощью Microsoft.Extensions.DependencyInjection разрешить тип и создать экземпляр, предоставив дополнительные параметры конструктора, за один раз?
То, что я хотел бы сделать, легко проиллюстрировать на примере. Ниже, в CreateSomethingWithContext, мне нужно использовать ActivatorUtilities.CreateInstance для вызова параметризованного конструктора, но я не знаю заранее конкретный тип для ISomething.
Я мог бы использовать serviceProvider.GetRequiredService для разрешения типа и создания экземпляра по умолчанию, но тогда я не смог передать параметр context.
Я мог бы использовать заводскую версию AddTransient, но это нарушит код, который уже использует GetRequiredService для создания экземпляров по умолчанию.
Ниже возможная уловка (которая мне не нравится) состоит в том, чтобы создать избыточный экземпляр Something по умолчанию только для того, чтобы определить его тип и передать его в ActivatorUtilities.CreateInstance вместе с параметром context.
Есть ли лучший способ сделать это? Чтобы уточнить: я не могу контролировать реальную библиотеку, реализующую ISomething/Something.
using System;
using Microsoft.Extensions.DependencyInjection;
namespace App
{
public interface ISomething
{
void DoSomething() => Console.WriteLine(nameof(DoSomething));
}
public class Something: ISomething
{
public Something() =>
Console.WriteLine($"{this.GetType().Name} created");
public Something(object context) =>
Console.WriteLine($"{this.GetType().Name} created with {context}");
}
static class Program
{
private static IServiceProvider BuildServices() => new ServiceCollection()
.AddTransient()
.BuildServiceProvider();
static ISomething CreateSomething(IServiceProvider serviceProvider) =>
serviceProvider.GetRequiredService();
static ISomething CreateSomethingWithContext(IServiceProvider serviceProvider, object context)
{
// first I need an instance of ISomething, only to learn its concrete type for
var something = serviceProvider.GetRequiredService();
var type = something.GetType();
// now that I have the type, I can use ActivatorUtilities.CreateInstance
var something2 = (ISomething)ActivatorUtilities.CreateInstance(
serviceProvider, type, context);
return something2;
}
static void Main()
{
var serviceProvider = BuildServices();
CreateSomething(serviceProvider);
CreateSomethingWithContext(serviceProvider, Guid.NewGuid());
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/692 ... and-constr
Могу ли я с помощью Microsoft.Extensions.DependencyInjection разрешить тип и создать экземпляр, предоставив дополнительн ⇐ C#
Место общения программистов C#
1767534115
Anonymous
Могу ли я с помощью Microsoft.Extensions.DependencyInjection разрешить тип и создать экземпляр, предоставив дополнительные параметры конструктора, за один раз?
То, что я хотел бы сделать, легко проиллюстрировать на примере. Ниже, в CreateSomethingWithContext, мне нужно использовать ActivatorUtilities.CreateInstance для вызова параметризованного конструктора, но я не знаю заранее конкретный тип для ISomething.
Я мог бы использовать serviceProvider.GetRequiredService для разрешения типа и создания экземпляра по умолчанию, но тогда я не смог передать параметр context.
Я мог бы использовать заводскую версию AddTransient, но это нарушит код, который уже использует GetRequiredService для создания экземпляров по умолчанию.
Ниже возможная уловка (которая мне не нравится) состоит в том, чтобы создать избыточный экземпляр Something по умолчанию только для того, чтобы определить его тип и передать его в ActivatorUtilities.CreateInstance вместе с параметром context.
[b]Есть ли лучший способ сделать это?[/b] Чтобы уточнить: я не могу контролировать реальную библиотеку, реализующую ISomething/Something.
using System;
using Microsoft.Extensions.DependencyInjection;
namespace App
{
public interface ISomething
{
void DoSomething() => Console.WriteLine(nameof(DoSomething));
}
public class Something: ISomething
{
public Something() =>
Console.WriteLine($"{this.GetType().Name} created");
public Something(object context) =>
Console.WriteLine($"{this.GetType().Name} created with {context}");
}
static class Program
{
private static IServiceProvider BuildServices() => new ServiceCollection()
.AddTransient()
.BuildServiceProvider();
static ISomething CreateSomething(IServiceProvider serviceProvider) =>
serviceProvider.GetRequiredService();
static ISomething CreateSomethingWithContext(IServiceProvider serviceProvider, object context)
{
// first I need an instance of ISomething, only to learn its concrete type for
var something = serviceProvider.GetRequiredService();
var type = something.GetType();
// now that I have the type, I can use ActivatorUtilities.CreateInstance
var something2 = (ISomething)ActivatorUtilities.CreateInstance(
serviceProvider, type, context);
return something2;
}
static void Main()
{
var serviceProvider = BuildServices();
CreateSomething(serviceProvider);
CreateSomethingWithContext(serviceProvider, Guid.NewGuid());
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/69207420/with-microsoft-extensions-dependencyinjection-can-i-resolve-the-type-and-constr[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия