Unity style назвал регистрацию сервиса в. net внедрение ядра? - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь иметь два типа регистрации для одной и той же услуги (ServiceA). Я хочу, чтобы один из них был scoped (один экземпляр на запрос клиента), а другой - transient (новый экземпляр каждый раз, когда от преобразователя требуется предоставить экземпляр).

Это так, когда клиент делает запрос, у меня нет нескольких экземпляров ServiceA, плавающих вокруг, когда передача одного из них сделает работу, но мне также нужно иметь возможность вращать один экземпляр по требованию, когда я прошу распознаватель разрешить экземпляр BackgroundJobService экземпляр (который зависит от НОВОГО экземпляра ServiceA, потому что экземпляр области действия удаляется, как только заканчивается запрос).

В Unity вы можете сделать что-то вроде:

//this will spin a new instance
container.RegisterType<DataProvider>("ForBackgroundJobs", new ContainerControlledLifetimeManager());
//this will return the same instance when resolved in the context of a request
container.RegisterType<DataProvider>(new Unity.AspNet.Mvc.PerRequestLifetimeManager());

А при разрешении

var service = container.Resolve<DataProvider>("ForBackgroundJobs"); // a new instance, each time this is called...
var service = container.Resolve<DataProvider>(); //same instance every time this is callede within the request.

Есть ли способ сделать что-то подобное с. NET поставщиком услуг Core?

1 Ответ

0 голосов
/ 13 января 2020

Вы можете добиться чего-то похожего с небольшим взломом.

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

public class TestClass: IScoped, ITrancient
{
    public string GetString() => "Test string";
}
public interface IScoped
{
    string GetString();
}

public interface ITrancient
{
    string GetString();
}

в конфигурации службы добавить:

.AddScoped<IScoped, TestClass>()
.AddTransient<ITrancient, TestClass>()

, чем вы можете получить доступ к классу с помощью желаемого интерфейса, такого как ServiceProvider.GetRequiredService ( ) или зарегистрируйте DI в конструкторе

...