Инъекция зависимостей C #: получение синглтона для внедрения в другой конструктор синглтона - PullRequest
0 голосов
/ 02 ноября 2019

Я хочу создать синглтон, основанный на другом синглтоне, который я создал при предыдущем вызове. Вот код:

services.AddSingleton<IPerson, Person>((ctx) => {
    WSPerson wsPerson = new WSPerson(new System.Net.Http.HttpClient(), new PersonRepo(new DBContext(optionsBuilder.Options)));
    IMemoryCache memoryCache = ctx.GetService<IMemoryCache>();
    return new Person(wsPerson, memoryCache);
});
services.AddSingleton<IEmployee, Employee>((ctx) => {
    EmployeeRepo employeeRepo = new EmployeeRepo(new DBContext(optionsBuilder.Options));
    IMemoryCache memoryCache = ctx.GetService<IMemoryCache>();
    // How to create instance of Person here, while taking the previous singleton added instead of creating another declaration of
    // WSPerson wsPerson = new WSPerson(new System.Net.Http.HttpClient(), new PersonRepo(new DBContext(optionsBuilder.Options)));
    // Person person = new Person(wsPerson, memoryCache);
    return new Employee(employeeRepo, memoryCache, /* person */);
});

Итак, в синглтоне сотрудника мне нужно объявить экземпляр Person, который я уже добавил синглтоном в предыдущей команде. Как передать одноэлементный объект Person, не объявляя другой объект Person внутри пользовательского конструктора одноэлементного сотрудника?

1 Ответ

1 голос
/ 02 ноября 2019

Разрешить синглтон с помощью предоставленного IServiceProvider ctx в фабричном делегате

//...

services.AddSingleton<IEmployee, Employee>((ctx) => {
    EmployeeRepo employeeRepo = new EmployeeRepo(new DBContext(optionsBuilder.Options));
    IMemoryCache memoryCache = ctx.GetService<IMemoryCache>();
    IPerson person = ctx.GetService<IPerson>(); //<-- gets the registered singleton
    return new Employee(employeeRepo, memoryCache, person);
});

//...

Предполагая, что две реализации зависят от абстракций, затем убедитесь, что все зависимости зарегистрированы, и избегайте фабричного делегата.

//...other dependencies assumed added to service collection 

services.AddSingleton<IPerson, Person>();
services.AddSingleton<IEmployee, Employee>();
...