powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Autofac. Как обеспечить, чтобы вложенные зависимости получат ту же конфигурацию ?
8 сообщений из 8, страница 1 из 1
Autofac. Как обеспечить, чтобы вложенные зависимости получат ту же конфигурацию ?
    #39796528
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите как можно такое законфигурировать.

Есть такие классы:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
interface IService;

interface IService1: IService;
interface IService2: IService;

interface IRepository;

class SettingsItem
{
   .... service settings
   .... connectionString
}

class ServiceSettings
{
   SettingsItem Service1Settings
   SettingsItem Service2Settings
}

class Repository: IRepository
{   
   ctor Repository (string connectionString)
}

class ServiceBase: IService
{
  ctor Service1 (SettingsItem, IRepository)
}

class Service1: ServiceBase, IService1
{
}

class Service2: ServiceBase, IService2
{
}



Структура сервисов, репозиториев и сеттингов идентична. Они все совершенно идентично, просто должны работать на разных базах данных.

Нужно, чтобы при резолве каждого сервиса, в него инжектились свои настройки (ServiceSettings.Service1Settings и ServiceSettings.Service2Settings соответствующие) + репозитории инжектились с настройками из раздела того-же сервиса. Т.е. в Service1 должен попасть репозиторий, connectionString которого взят из ServiceSettings.Service1Settings

Код: c#
1.
2.
 var service1 =  scope.Resolve<IService1>();
 var service2 =  scope.Resolve<IService2>();



Ну понятно, что в худшем варианте я могу все жестко законфигурировать через RegisterInstance, везде задав синглтоны. Но хочется, чтобы было чище, как-то типа того:

Код: c#
1.
2.
3.
4.
5.
6.
builder.RegisterType<Service1>()
       .As<IService>()
       .WithParameter(
         new ResolvedParameter(   // тут как-то отрезолвить репозиторий с нужными сеттингами
           (pi, ctx) => ....,                 
           (pi, ctx) => ...));



Как это можно законфигурировать ? Возможно я переборщил с иерархией и от каких-то лишних классов, интерфейсов можно отказаться вообще.
...
Рейтинг: 0 / 0
Autofac. Как обеспечить, чтобы вложенные зависимости получат ту же конфигурацию ?
    #39796548
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дополню.
Я конечно могу сделать полностью отдельную иерахию вида:

Код: c#
1.
2.
3.
4.
5.
6.
7.
IRepository1: IRepository
IRepository2: IRepository

Service1: IService1
{
   Service1 (IRepository1)   
}



Но это ужасная идея. Если потом появится третья база, то придется создавать новую иерархию ? Нет уж.
Хотелось бы лишь, чтобы нужно было скопипастить конфигурационный код, и дальше иметь возможность резолвить сервис на новую базу.
...
Рейтинг: 0 / 0
Autofac. Как обеспечить, чтобы вложенные зависимости получат ту же конфигурацию ?
    #39796550
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По хорошему, даже Service1 и Service2 не нужны ! Просто я не придумал как тогда можно будет резолвить их по отдельности.

Можно конечно с Keyed поэкспериментировать.
...
Рейтинг: 0 / 0
Autofac. Как обеспечить, чтобы вложенные зависимости получат ту же конфигурацию ?
    #39796766
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreПо хорошему, даже Service1 и Service2 не нужны ! Просто я не придумал как тогда можно будет резолвить их по отдельности.

Можно конечно с Keyed поэкспериментировать.

Регистрировать как named и лепить простенькую фактори с резолвом по имени.
...
Рейтинг: 0 / 0
Autofac. Как обеспечить, чтобы вложенные зависимости получат ту же конфигурацию ?
    #39797109
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну keyed и named суть одна и та же. Я написал такой вариант решения, его и делаю сейчас. Но не очень красиво выходить. Приходится фактически описывать конструирование всех объектов через лямбду, где резолвить нужные зависимости по заданному ключу. Т.е. чтобы в сервис обязательно попали его сетинги, и репозиторий с его же сетингами. Но как-то не красиво. Если добавится новый сервис-база данных, придется добавлять новую цепочку.
...
Рейтинг: 0 / 0
Autofac. Как обеспечить, чтобы вложенные зависимости получат ту же конфигурацию ?
    #39797113
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore,
Есть мнние, что при EF/ОРМ репозитарий не нужен.
Бред?
...
Рейтинг: 0 / 0
Autofac. Как обеспечить, чтобы вложенные зависимости получат ту же конфигурацию ?
    #39797147
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Ну это все спорно. копья ломают уже не первый год. Поищите в интернете статьи типа "репозиторий и Unit of Work поверх EF".

Суть сейчас не в этом. А в то, чтобы как-то удобно и просто законфигурировать несколько взаимосвязанных объектов . Не важно что там. Репозиторий или нет. В частности тут мне нужно, чтобы в сервис и репозиторий попали одни и те же сеттинги.

И ничего лучше этого не придумал:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public enum ServiceType (service1, service2)

...
RegisterRepository (ServiceType.service1);
RegisterRepository (ServiceType.service2);
....

public RegisterRepository (builder, ServiceType serviceType)
{
builder.RegisterType<MyRepository>()
                .WithParameter((pinfo, ctx) =>
                {
                    return
                    pinfo.Name == "connectionString" &&
                    pinfo.ParameterType == typeof(string);
                },
                (pinfo, ctx) =>
                {
                    var settings = ctx.ResolveKeyed<IMySettings>(serviceType);
                    return settings.Db.ConnectionString;
                })
                .Keyed<IMyRepository>(serviceType);
}
...
Рейтинг: 0 / 0
Autofac. Как обеспечить, чтобы вложенные зависимости получат ту же конфигурацию ?
    #39797150
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут проблема в том, что если входных параметров несколько, то их все нужно четко прописать, резолвя через ResolveKeyed.
И так к каждому объекту в иерархии.

Очень много кода выходит, по сравнению с простым, классическим вызовом RegisterType.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Autofac. Как обеспечить, чтобы вложенные зависимости получат ту же конфигурацию ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]