powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / DI/ASP.NETCore/N-Tier
6 сообщений из 6, страница 1 из 1
DI/ASP.NETCore/N-Tier
    #39489958
yabs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня.

Пишем приложение с фронтендом на Asp.net Core MVC(на обычном .net 4.6).
Т.е. на .Net core только проект с веб приложением.
Очень понравился DI контейнер из коробки:
Код: c#
1.
services.AddSingleton<IWorkflowStorageService, WorkflowRepositoryService>();


все прекрасно, когда проект с веб приложением знает о проекте(Business), где располагается класс, имплементирующий интерфейс.
Но как быть с зависимостями, которые имплементируются в проектах, которые веб-проект не видит(например репозитории из подпроекта Persistence)?

подключать еще один DI контейнер не хотелось бы. Как наиболее православно решить эту проблему?

Пока приходит в голову только следующее:

в проекте Business что-нибудь типа
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 public static class RepositoryInjector
    {        
        public static IDBRepository DBRepositoryImplementation 
        {
            get
            {
                return new DBRepository();
            }
        }

    }



и в Startup.cs
Код: c#
1.
services.AddSingleton<IDBRepository>(RepositoryInjector.DBRepositoryImplementation);



И еще задание со звездочкой:
есть еще проект с консольным приложением(.Net 4.6), который также обращается к слою Business.
Желательно, чтобы для консоли не нужно было перечислять интерфейсы и классы их имплементирующие еще раз.

Заранее спасибо.
...
Рейтинг: 0 / 0
DI/ASP.NETCore/N-Tier
    #39490043
Фотография tAZAR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yabs,

Как насчет использования UnitOfWork, который отдает репозитории и зарегистрирован в контейнере?
У нас веб-приложение под netcoreapp1.1/net462 собирается, все остальные сборки netstandard1.5.

Поделюсь идеей.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
using System;
using System.Data;
using Microsoft.EntityFrameworkCore;

namespace XX.Core.Interfaces {
    public interface IUnitOfWork<out TDbContext>: IDisposable where TDbContext:DbContext{
        TDbContext DbContext { get;}
        IDbConnection Connection { get; }
        void SaveChanges();
    }
}



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.EntityFrameworkCore;
using XX.Core.Repositories;

namespace XX.Core
{
    public class AppUnitOfWork:UnitOfWork<AppDataContext>{
        public AppUnitOfWork(DbContextOptions options):base(options) {
            
        }

        public AARepository GetAARepository() {
            return new AARepository(DbContext);
        }

        public BBRepository GetBBRepository() {
            return new BBRepository(DbContext);
        }
    }
}



Код: 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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
using System;
using System.Data;
using Microsoft.EntityFrameworkCore;
using XX.Core.Interfaces;

namespace XX.Core {
    public class UnitOfWork<TDbContext> : IUnitOfWork<TDbContext> where TDbContext : DbContext {
        [ThreadStatic] //Нам нужно так. Потому что каждый запрос в своем потоке. В каждом потоке свой контекст автоматом получается.
        private static TDbContext _dbContext;

        private readonly bool _isNested;

        public TDbContext DbContext => _dbContext;

        public IDbConnection Connection => DbContext.Database.GetDbConnection();

        public UnitOfWork(DbContextOptions options) {
            if (options == null) throw new ArgumentNullException(nameof(options));
            _isNested = _dbContext != null;
            if (!_isNested) {
                _dbContext = (TDbContext)Activator.CreateInstance(typeof(TDbContext), options);
            }
        }

        public void SaveChanges() {
            _dbContext.SaveChanges();
        }

        protected virtual void Dispose(bool disposing) {
            if (_isNested)
                return;
            if (disposing) {
                if (_dbContext != null) {
                    _dbContext.Dispose();
                    _dbContext = null;
                }
            }
        }

        public void Dispose() {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    }
}



Код: c#
1.
2.
 services.AddScoped<AppUnitOfWork>(); //Вот из-за этого с регистрацией в консольном приложении вопросы останутся.
//Но нам нужно так. В принципе в консольном приложении используется тот же DI из коробки.



Также есть моменты, где то, что создается внутри UoW, можно достать из контейнера. Это дело ваше.
Код упрощен, все опечатки случайны.
...
Рейтинг: 0 / 0
DI/ASP.NETCore/N-Tier
    #39490112
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yabsподключать еще один DI контейнер не хотелось бы. Как наиболее православно решить эту проблему?Сменить веру и подключить нормальный "универсальный" контейнер. Интегрировать его с Asp Net.

Getting Started with Autofac and MVC6 + ASP.NET Core (aka ASP.NET 5)
...
Рейтинг: 0 / 0
DI/ASP.NETCore/N-Tier
    #39490349
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yabs,

Интегрируй Autofac и используй его модули, получишь независимую, закрытую регистрацию сервисов и кучу плюшек Autofaca, и всё это на каркасе Microsoft.Extensions.DependenyInjection.Abstraction в среде веб приложения.
...
Рейтинг: 0 / 0
DI/ASP.NETCore/N-Tier
    #39490350
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tAZARТакже есть моменты, где то, что создается внутри UoW, можно достать из контейнера. Это дело ваше.

Печально, что UnitOfWork публичный класс. По-хорошему, имплементации должны быть internal, по возможности.
...
Рейтинг: 0 / 0
DI/ASP.NETCore/N-Tier
    #39490351
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кyabsподключать еще один DI контейнер не хотелось бы. Как наиболее православно решить эту проблему?Сменить веру и подключить нормальный "универсальный" контейнер. Интегрировать его с Asp Net.

Getting Started with Autofac and MVC6 + ASP.NET Core (aka ASP.NET 5)

+100500
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / DI/ASP.NETCore/N-Tier
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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