Я начинаю с MVC3 и хочу использовать гибкую архитектуру, поэтому я прочитал десятки блогов, книгу (Pro ASP. NET MVC 3), прочитал о принципах SOLID и, наконец, добрался до структуры приложения, которая мне нравится (или, по крайней мере, я так думаю, потому что я еще ничего на ней не построил):
В этой структуре:
Основная причина использования доменов Services заключается в проверке уникальных ключей на методах Validate классов POCO (IValidatable).
Я начинаю создавать эталонное приложение с такой структурой, но пока что я столкнулся с двумя проблемами:
Я использую проект Data.Tests с модульными тестами для репозиториев, но не нашел способа внедрить (с помощью Ninject) реализация службы (в конструкторе или иным образом) в модели, поэтому метод Validate может вызывать CheckUniqueKey в службе.
Я не нашел никаких упоминаний о подключении 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 займет больше времени.
В этом отношении мне пришлось объединить Домен, Услуги и Данные, я создам другой вопрос в другой раз и пока продолжу работу над проектом.
Всем спасибо.