Использование Ninject в архитектуре приложения SOLID

Я начинаю с MVC3 и хочу использовать гибкую архитектуру, поэтому я прочитал десятки блогов, книгу (Pro ASP. NET MVC 3), прочитал о принципах SOLID и, наконец, добрался до структуры приложения, которая мне нравится (или, по крайней мере, я так думаю, потому что я еще ничего на ней не построил):

enter image description here

В этой структуре:

  • Домен содержит классы POCO и определяет интерфейсы служб
  • Службы реализуют интерфейсы служб и определяют интерфейсы репозиториев
  • Данные реализуют интерфейсы репозиториев
  • WebUI и домен используют службы
  • Службы используют Re positories
  • WebUI, Services и Data зависят от домена для классов POCO

Основная причина использования доменов Services заключается в проверке уникальных ключей на методах Validate классов POCO (IValidatable).

Я начинаю создавать эталонное приложение с такой структурой, но пока что я столкнулся с двумя проблемами:

  1. Я использую проект Data.Tests с модульными тестами для репозиториев, но не нашел способа внедрить (с помощью Ninject) реализация службы (в конструкторе или иным образом) в модели, поэтому метод Validate может вызывать CheckUniqueKey в службе.

  2. Я не нашел никаких упоминаний о подключении Ninject к TEST-проекту (много для проекта WebUI).

Я пытаюсь достичь здесь возможности переключиться с EF на что-то еще, например DAPPER , просто изменив сборку DATA.

ОБНОВЛЕНИЕ

Прямо сейчас (по состоянию на 09 августа 2011 г.) Ninject работает, но я думаю, что мне что-то не хватает.

У меня есть CustomerRepository с двумя конструкторами:

public class CustomerRepository : BaseRepository<Customer>, ICustomerRepository
{
    // The repository usually receives a DbContext
    public CustomerRepository(RefAppContext context)
        : base(context)
    {
    }

    // If we don't receive a DbContext then we create the repository with a defaulte one
    public CustomerRepository()
        : base(RefApp.DbContext())
    {
    }

    ...
}

В TestInitialize:

// These are for testing the Repository against a test database

[TestInitialize()]
public void TestInitialize()
{
    // Context used for tests
    this.context = new RefAppContext();

    // This is just to make sure Ninject is working, 
    // would have used: repository = new CustomerRepository(context);

    this.kernel = NinjectMVC3.CreateKernel();

    this.kernel.Rebind<ICustomerRepository>().To<CustomerRepository>().WithConstructorArgument("context", context);

    this.repository = kernel.Get<ICustomerRepository>();

}

В классе Customer:

public class Customer : IValidatableObject 
{
    ...

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        // I want to replace this with a "magic" call to ninject
        CustomerRepository rep = new CustomerRepository();

        Customer customer = rep.GetDupReferenceCustomer(this);

        if (customer != null)
            yield return new ValidationResult("Customer \"" + customer.Name + "\" has the same reference, can't duplicate", new [] { "Reference" });
    }

    ...
}

Как лучше всего использовать Ninject в этом сценарии?

Любая помощь будет принята с благодарностью.

ОТВЕТ, ВИД

Я буду считать этот вопрос пока решенным. Я мог бы заставить Ninject работать вроде как, но похоже, что достижение Принципа инверсии зависимостей (DIP) SOLID займет больше времени.

В этом отношении мне пришлось объединить Домен, Услуги и Данные, я создам другой вопрос в другой раз и пока продолжу работу над проектом.

Всем спасибо.

9
задан Miguel Veloso 11 August 2011 в 17:24
поделиться