Я должен переписать старое классическое веб-приложение 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