#c# #asp.net-core-2.0
#c# #asp.net-core-2.0
Вопрос:
У меня есть несколько пар интерфейсов и реализация такая
ICategoryService -> CategoryService
ICategoryTypeService -> CategoryTypeService
IOrderService -> OrderService
ILoggingService -> LoggingService
Все классы и интерфейсы Data.dll
включены, и я повторяю это так.
foreach (var type in serviceAssembly.GetTypes())
{
if (type.Name.Contains("Repository") amp;amp; !type.IsInterface amp;amp; !type.IsGenericType)
{
Type interfaceImplement = type.GetInterfaces().SingleOrDefault(t => t.IsGenericType == false);
if (interfaceImplement != null)
{
System.Diagnostics.Debug.WriteLine($"{type.Name} is inherited by {interfaceImplement.Name}");
services.AddTransient(interfaceImplement, type);
}
}
}
и я получаю эту ошибку
Исключение InvalidOperationException: не удалось разрешить службу для типа ‘VietWebSite.Обслуживание.ILoggingService’ при попытке активировать ‘VietWebSite.Web.Areas.WebAPI.Администратор.ValuesController’.
но это сработает, если я изменю свой код таким образом:
services.AddTransient<ILoggingService, LoggingService>();
services.AddTransient<ICategoryService, CategoryService>();
services.AddTransient<ICategoryTypeService, CategoryTypeService>();
services.AddTransient<IOrderService, OrderService>();
Пожалуйста, помогите.
Спасибо
Комментарии:
1. Разве строка
type.Name.Contains("Repository")
не должна бытьtype.Name.Contains("Service")
?2. Извините. Это моя ошибка. Я перешел на сервис, но все равно получаю ту же ошибку
3. Содержит ли отладочный вывод все необходимые типы?
4. Кстати, есть библиотеки, которые могут выполнять ту же задачу, например github.com/khellang/Scrutor
5. Я отлаживал, и они были нулевыми
Ответ №1:
Вот рабочая демонстрация:
-
Создайте
Data
библиотеку с классом и интерфейсом:public interface ICategoryService { string Output(); } public class CategoryService : ICategoryService { public string Output() { return "CategoryService.Output"; } } public interface ILoggingService { string Output(); } public class LoggingService : ILoggingService { public string Output() { return "LoggingService.Output"; } }
-
Добавить
Data
ссылку на библиотеку в asp.net основной проект -
Настройте
Startup.cs
какvar serviceAssembly = Assembly.GetAssembly(typeof(CategoryService)); foreach (var type in serviceAssembly.GetTypes()) { if (type.Name.Contains("Service") amp;amp; !type.IsInterface amp;amp; !type.IsGenericType) { Type interfaceImplement = type.GetInterfaces().SingleOrDefault(t => t.IsGenericType == false); if (interfaceImplement != null) { System.Diagnostics.Debug.WriteLine($"{type.Name} is inherited by {interfaceImplement.Name}"); services.AddTransient(interfaceImplement, type); } } }
-
Пример использования:
public class HomeController : Controller { private readonly ILoggingService _loggingService; public HomeController(ILoggingService loggingService) { _loggingService = loggingService; } public IActionResult Index() { var result = _loggingService.Output(); return View(); } }
Обновить:
Ваша проблема вызвана тем, что AppDomain.CurrentDomain.GetAssemblies()
будут возвращены только загруженные сборки, попробуйте код ниже:
//Load Assemblies
//Get All assemblies.
var refAssembyNames = Assembly.GetExecutingAssembly()
.GetReferencedAssemblies();
//Load referenced assemblies
foreach (var asslembyNames in refAssembyNames)
{
Assembly.Load(asslembyNames);
}
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
var myAssemblies = assemblies.Where(assem => assem.GetName().Name.Contains("VietWebSite.Data") || assem.GetName().Name.Equals("VietWebSite.Service"));
Комментарии:
1. Мой способ такой же, как и у вас, но он не работает, пожалуйста, смотрите Изображения img1 , img2 , img3
2. Я поделился zip-файлом здесь . Вы можете загрузить и запустить api (/admin/api/values)
3. Хорошо, я постараюсь сообщить вам результат.
Ответ №2:
То, как вы это сделали, является правильным ручным способом сделать это. Насколько мне известно, автоматического способа введения встроенных зависимостей не существует, но есть доступные пакеты, которые выполняют такие функции, как AutoFac https://autofac.org /.
Комментарии:
1. Любой способ сделать это? потому что я не включаю autofac