Я новичок в насмешливости и зависимости, и вам нужно руководствоваться.Rhino Mocks, инъекция зависимостей и разделение проблем
Мое приложение использует типичную архитектуру N-уровня, где BLL ссылается на DAL, а пользовательский интерфейс ссылается на BLL, но не на DAL. Довольно прямо.
Позволяет сказать, к примеру, у меня есть следующие классы:
class MyDataAccess : IMyDataAccess {}
class MyBusinessLogic {}
Каждый существует в отдельной сборке.
Я хочу высмеять MyDataAccess в тестах для MyBusinessLogic. Поэтому я добавил конструктор класса MyBusinessLogic, чтобы принять параметр IMyDataAccess для инъекции зависимостей. Но теперь, когда я пытаюсь создать экземпляр MyBusinessLogic на уровне пользовательского интерфейса, он требует ссылки на DAL.
Я думал, что могу определить конструктор по умолчанию в MyBusinessLogic, чтобы установить стандартную реализацию IMyDataAccess, но не только это похоже на кодовое хранилище, на самом деле это не решило проблему. У меня все равно будет публичный конструктор с IMyDataAccess в подписи. Таким образом, слой UI по-прежнему требует ссылки на DAL для компиляции.
Одним из возможных решений, с которым я сталкиваюсь, является создание внутреннего конструктора для MyBusinessLogic с параметром IMyDataAccess. Затем я могу использовать Accessor из тестового проекта для вызова конструктора. Но есть еще этот запах.
Какое здесь общее решение. Я просто должен делать что-то неправильно. Как я могу улучшить архитектуру?
Как использование емкости IoC влияет на производительность? Мне очень нравится это решение, и я сейчас играю с Castle. – mikesigs
@whatispunk: Использование контейнера IoC не влияет на производительность после запуска. Если время запуска увеличивается слишком долго из-за количества подключаемых объектов, обычно у вас есть средства в контейнере для обеспечения ленивой загрузки (например, 'System.Lazy' для управляемой инфраструктуры расширяемости). –
Делает смысл. И в моем случае я работаю над веб-приложением, поэтому время запуска не имеет большого значения. Спасибо за вашу помощь. – mikesigs