Как динамически разрешать более 50 классов с одним и тем же интерфейсом с помощью Autofac DI - PullRequest
0 голосов
/ 02 декабря 2011

Я только начинаю использовать Autofac DI впервые в большом производственном проекте. В настоящее время у меня есть регистрация и разрешение "нормальных" ситуаций в Asp.Net MVC3. Под этим я подразумеваю контроллеры, бизнес-уровень, репозитории и т. Д.

Моя проблема в том, что у меня более 50 классов, которые имеют одинаковый интерфейс. Я мог бы дать каждому классу уникальный тип интерфейса, но проблемы с этим подходом:

  1. Это чрезвычайно утомительно, так как методы абсолютно одинаковы для всех классов
  2. Это нарушает все принципы СУХОГО кодирования.

Используется в качестве ссылки на класс, для которого создается экземпляр пользовательского атрибута MVC3 в наших моделях представления. Использование:

[CustomAttribute(typeof(foo))]
Public string FooProperty {get;set;};

Этот атрибут затем используется в пользовательском методе HTML Helper MVC3 и получает полное имя типа (или может быть System.Type) для использования из атрибута [CustomAttribute(typeof(foo))]. От имени класса до экземпляра метод Html.Helper запрашивает создание экземпляра класса. До того, как мы добавили DI в приложение, мы работали с помощью System.Activator.CreateInstance.

Этот подход был принят, потому что он решает проблемы в других частях приложения, где информация об атрибутах используется повторно.

Когда я посмотрел на несколько способов сделать это и был серьезно озадачен правильным подходом. Некоторое руководство будет оценено.

1 Ответ

3 голосов
/ 04 декабря 2011

Вы не обязаны разрешать интерфейсы из контейнера Autofac, вы также можете разрешать конкретные классы. Это зависит от типа регистрации. Вы можете массово зарегистрировать свои 50+ классов, ища типы, реализующие ваш специальный интерфейс, а затем зарегистрировать эти классы с помощью «self»: ​​

var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(assemblyWithClasses)
    .Where(type => type.IsAssignableTo<IYourSpecialInterface>())
    .AsSelf();
var container = builder.Build();

AsSelf обеспечивает возможность разрешения по имени класса, например:

var type = Type.GetType("OneOfThe50PlusClasses");
var instance = container.Resolve(type);
...