Как зарегистрировать сборки, если интерфейсы находятся в отдельных сборках, используя Autofac - PullRequest
0 голосов
/ 31 декабря 2018

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

enter image description here

и использовал следующеекод для регистрации сборок

builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
   .Where(t => t.Name.EndsWith("Repository"))
   .AsImplementedInterfaces()
   .InstancePerRequest();
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
   .Where(t => t.Name.EndsWith("Service"))
   .AsImplementedInterfaces()
   .InstancePerRequest();
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
   .Where(t => t.Name.EndsWith("Entity"))
   .AsImplementedInterfaces()
   .InstancePerRequest();
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
   .Where(t => t.Name.EndsWith("Controller"));

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

enter image description here

1) можно ли использовать такой шаблон для инверсии управления / внедрения зависимостей?

2) если да, то как зарегистрировать сборки?

ПРИМЕЧАНИЕ 1: -TheСлой GUI имеет только ссылки на сборки Interfaces, а не на конкретные сборки классов.

ПРИМЕЧАНИЕ 2: - И я проверил, нет ли конкретных папок сборок в папке bin

ПРИМЕЧАНИЕ 3: - Стрелки показывают ссылку на сборки

ПРИМЕЧАНИЕ 4: - Получитеследующая ошибка Error Picture

1 Ответ

0 голосов
/ 31 декабря 2018

Я не знаю, является ли это твердым решением или обходным путем

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

НО

, если вы помещаете конкретные классы и связанные интерфейсы в отдельный проект / сборки, тогда вы ссылаетесь только на проект / сборки интерфейса, а не на проект / сборки конкретных классов какреализовать

SOLID

Тогда возникает проблема, поскольку вы ссылаетесь только на интерфейсы, поэтому dot net не будет перемещать сборки (dll) конкретного класса в папку выполнения проекта пользовательского интерфейса (asp.net mvc) и AutofacУ меня проблема с разрешением зависимостей

Теперь, как я решил, я добавил команду скопировать сборку (файл dll) каждого проекта библиотеки классов в папку bin пользовательского интерфейса (asp.net mvc) в записи проекта библиотеки классов.построить событие, как показано ниже

Copy command in post build project

Затем использовал следующий код для загрузки и регистрации сборок с помощью Autofac

        AppDomain.CurrentDomain.Load("WsafEntities");
        AppDomain.CurrentDomain.Load("WsafEntitiesInterfaces");

        AppDomain.CurrentDomain.Load("WsafDACs");
        AppDomain.CurrentDomain.Load("WsafDACsInterfaces");

        AppDomain.CurrentDomain.Load("WsafRepositories");
        AppDomain.CurrentDomain.Load("WsafRepositoriesInterfaces");

        builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies().Where(t => t.FullName.Contains("Wsaf")).ToArray())
            .AsImplementedInterfaces();

        builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
            .Where(t => t.Name.EndsWith("Controller"));
...