Простое внедрение зависимостей Mvc из уровня обслуживания в уровень данных (трехуровневое приложение) - PullRequest
0 голосов
/ 28 ноября 2018

Я должен переписать старое классическое веб-приложение asp.Я выбрал архитектуру в трех уровнях (уровень / проект = уровень слоя)

  • Web: представления и контроллеры, максимально тонкие.Проект уровня обслуживания ссылок.
  • Сервис: бизнес-логика.Проект уровня данных.
  • Данные: запросы ado net, подключение к базе данных и управление транзакциями.Нет ссылок на другие проекты

В веб-уровне я управляю внедрением сервисного уровня с помощью этого простого класса DI

[assembly: OwinStartupAttribute(typeof(MyApp.Startup))]
namespace MyApp
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var services = new ServiceCollection();
            ConfigureServices(services);
            var resolver = new DefaultDependencyResolver(services.BuildServiceProvider());
            DependencyResolver.SetResolver(resolver);
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersAsServices(typeof(Startup).Assembly.GetExportedTypes()
                .Where(t => !t.IsAbstract && !t.IsGenericTypeDefinition)
                .Where(t => typeof(IController).IsAssignableFrom(t)
                   || t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)));

            services.AddSingleton<IAuthenticationService, AuthenticationService>();
            services.AddSingleton<IChannelService, ChannelService>();
            //add more DI services here...
        }
    }
}

Веб-уровень ничего не знает о слое данных, так каквнедрить классы слоя данных?Мне нужно, по крайней мере, сделать слой данных доступным в слое сервиса, но как мне сделать класс, подобный классу выше, в слое сервиса?

РЕДАКТИРОВАТЬ: возможное решение из комментария теперь удалено.Также я нашел интересную статью об этом аргументе здесь

https://asp.net -hacker.rocks / 2017/03/06 / using-dependency-инъекция-в-нескольких-проектах.html

создать класс расширения на уровне обслуживания, который добавляет зависимости уровня данных к экземпляру IServiceCollection

namespace MyApp.Service
{
    public static class IServiceCollectionExtension
    {
        public static IServiceCollection AddDataQueries(this IServiceCollection services)
        {
            //services.AddTransient<IQuery, Query>();
            //...add here DI of other data services
            return services;
        }
    }
}

и в классе запуска

 services.AddSingleton<IAuthenticationService, AuthenticationService>();
 services.AddSingleton<IChannelService, ChannelService>();
 //add more DI services here...
 services.AddDataQueries();
 //add DI for other layers
...