Могу ли я с помощью Microsoft.Extensions.DependencyInjection разрешить тип и создать экземпляр, предоставив дополнительнC#

Место общения программистов C#
Ответить
Anonymous
 Могу ли я с помощью Microsoft.Extensions.DependencyInjection разрешить тип и создать экземпляр, предоставив дополнительн

Сообщение Anonymous »

Могу ли я с помощью 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»