Существует ли .NET IoC, который предпочитает соглашения по конфигурации? - PullRequest
7 голосов
/ 15 января 2009

Проще говоря, если вам пришлось использовать контейнер IoC / DI, это легко развернуть (не большой поклонник использования файла config / xml для всего), стабильная, хорошая документация и поддержка .net, какой бы он ни был.

Это может быть только я, но слишком много xml-файлов, таких как один для приложения, несколько для ORM, несколько для другого компонента, иногда становится ошеломляющим. Кроме того, как я вижу, если есть один способ сделать что-то (соглашение), меньше шансов испортить вещи.

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

Ответы [ 6 ]

4 голосов
/ 15 января 2009

Я думаю, вы найдете эту функцию в большинстве контейнеров. Взгляните на это сообщение в блоге . Это немного в возрасте, но это даст вам представление. К настоящему времени активные контейнеры, вероятно, имеют лучшую поддержку.

2 голосов
/ 15 января 2009

Возможно, вы можете использовать DI без контейнера?

Вот пример, который использует инжектор конструктора:

public static void Main() {
  ILogger logger = new FileLogger();
  ISession session = new ConcreteSession();
  IRepository repository = new MyDataRepositoryImpl(session, logger);

  IApplication app = new MyApplication();
  app.AddModule(new DataSelector(repository));
  app.AddModule(new Editor(repository, new MyEditorFactory(session)));
  app.AddModule(new LdapAuthenticator(session, logger));
  // ...
  app.Run();
}

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

Зачастую вам не нужны продвинутые фреймворки для управления вашими зависимостями с помощью внедрения.

2 голосов
/ 15 января 2009

Я использую Ninject и StructureMap - оба позволяют подключить конфигурацию без XML.

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

1 голос
/ 16 января 2009

Попробуйте LinFu . Это один из самых простых и гибких контейнеров, требующий наименьшего количества кода, и единственный контейнер в этом сравнении контейнеров IOC, который прошел ВСЕ тесты. Наслаждайтесь:)

0 голосов
/ 20 января 2009

Замок Виндзор позволяет это через регистр звонков. Простой сценарий, скажем, у вас есть много контроллеров, которые реализуют интерфейс IController :

container.Register(AllTypes.FromAssembly(assemblyA).BasedOn(typeof(IController));

Вы можете еще больше упростить это, создав интерфейс IService (без членов) и добавив его к описанному выше. Таким образом, когда вы создаете сервис, он автоматически регистрируется.

0 голосов
/ 16 января 2009

Последняя версия StructureMap , 2.5.2, не только позволяет вам конфигурировать ваш контейнер без XML, как сказал Райан, но также имеет возможность автоматической передачи данных в соответствии с соглашением, которое, кажется, точно что вы ищете.

ObjectFactory.Initialize(x => x.Scan(scanner =>
                                        {
                                           scanner.TheCallingAssembly();
                                           scanner.WithDefaultConventions();
                                        }));;

Из документов на IAssemblyScanner.WithDefaultConvents ():

Добавляет DefaultConventionScanner в операция сканирования. то есть конкретный класс с именем "Что-то", что реализует "что-нибудь" будет автоматически добавляется в PluginType "ISomething"

Лично я с этим мало что делал, поскольку у меня уже была существующая конфигурация, в которой использовался интерфейс Fluent. Но выглядит многообещающе.

EDIT: Джереми Миллер только что опубликовал пост о том, как создавать свои СОБСТВЕННЫЕ конвенции ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...