Ninject и частные конструкторы - PullRequest
       22

Ninject и частные конструкторы

4 голосов
/ 27 сентября 2011

Мы используем Ninject для IOC.

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

public class SomeRepository : ISomeRepository
{
 private SomeRepository()
 {
 }
 public static ISomeRepository Create()
 {
   return StandardKernel.Get<ISomeRepository>();
 }
}

Проблема заключается в следующем: как мне заставить Ninject создать реальный объект? У меня есть интерфейс и класс хранилища в одном проекте

Ответы [ 3 ]

3 голосов
/ 28 сентября 2011

В конечном итоге мы будем использовать следующее:

public class SomeRepository : ISomeRepository
{
 private SomeRepository()
 {
 }
 public static ISomeRepository CreateForIOC()
 {
   return new SomeRepository();
 }
}

и во время загрузки модуля мы сопоставляем интерфейс ISomeRepository StandardKernel с методом CreateForIOC ().

Это не останавливаетразработчики могут напрямую вызывать CreateForIOC, но, по крайней мере, вынуждают их: а) кодировать интерфейс, б) осознавать, что CreateForIOC (), вероятно, не тот метод, который нужно вызывать при создании экземпляра объекта, и, по крайней мере, задавать вопрос об этом ведущему разработчику.

1 голос
/ 27 сентября 2011

Вместо частного конструктора или фабричного метода, почему бы просто не заставить Ninject предоставлять конкретный репозиторий любым объектам, которые в этом нуждаются?

0 голосов
/ 27 сентября 2011

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

Я бы предложил вместо этого просто настроить Ninject для создания одного экземпляра вашего приложения без частного конструктора.

...