Я узнал, как решить мою проблему, добавив эту строку кода в мой GridView:
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:SecurityDBConnectionString2 %>" SelectCommand="SELECT [SempID], [EmpName], [PDNo], [Position], [DateHired], [ContactNo], [Email], [EmergencyContactNo], [DateQuitTerminated], [ContactPerson], [Remarks], [Status] FROM [Personnel] WHERE ([Status] = @Status)">
<SelectParameters>
<asp:Parameter DefaultValue="1" Name="Status" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
, Но то, что не ясно мне, - то, где фабрика "слой" находится с архитектурой DDD? Фабрика должна звонить непосредственно в репозиторий для получения его данных или сервисной библиотеки?
фабрика должна быть универсальным магазином для построения объектов области. Любая другая часть кода, который должен сделать это, должна использовать фабрику.
Как правило, существует по крайней мере три источника данных, которые используются в качестве входа в фабрику для конструкции объекта области: вход от UI, результатов запросов от персистентности и доменно-значимых запросов. Таким образом для ответа на конкретный вопрос репозиторий использовал бы фабрику.
Вот пример. Я использую шаблон Разработчика Holub здесь. Редактирование : игнорируйте использование этого шаблона. Я начал понимать, что это не смешивается слишком хорошо с фабриками DDD .
// domain layer
class Order
{
private Integer ID;
private Customer owner;
private List<Product> ordered;
// can't be null, needs complicated rules to initialize
private Product featured;
// can't be null, needs complicated rules to initialize, not part of Order aggregate
private Itinerary schedule;
void importFrom(Importer importer) { ... }
void exportTo(Exporter exporter) { ... }
... insert business logic methods here ...
interface Importer
{
Integer importID();
Customer importOwner();
Product importOrdered();
}
interface Exporter
{
void exportID(Integer id);
void exportOwner(Customer owner);
void exportOrdered(Product ordered);
}
}
// domain layer
interface OrderEntryScreenExport { ... }
// UI
class UIScreen
{
public UIScreen(OrderEntryDTO dto) { ... }
}
// App Layer
class OrderEntryDTO implements OrderEntryScreenExport { ... }
Вот то, на что мог бы быть похожим OrderFactory:
interface OrderFactory
{
Order createWith(Customer owner, Product ordered);
Order createFrom(OrderEntryScreenExport to);
Order createFrom(List<String> resultSets);
}
логика для представляемого продукта и поколения Маршрута входит в OrderFactory.
Теперь вот то, как фабрика могла бы использоваться в каждом экземпляре.
В OrderRepository:
public List<Order> findAllMatching(Criteria someCriteria)
{
ResultSet rcds = this.db.execFindOrdersQueryWith(someCriteria.toString());
List<List<String>> results = convertToStringList(rcds);
List<Order> returnList = new ArrayList<Order>();
for(List<String> row : results)
returnList.add(this.orderFactory.createFrom(row));
return returnList;
}
На Вашем прикладном уровне:
public void submitOrder(OrderEntryDTO dto)
{
Order toBeSubmitted = this.orderFactory.createFrom(dto);
this.orderRepo.add(toBeSubmitted);
// do other stuff, raise events, etc
}
На Вашем доменном слое, модульный тест, возможно:
Customer carl = customerRepo.findByName("Carl");
List<Product> weapons = productRepo.findAllByName("Ruger P-95 9mm");
Order weaponsForCarl = orderFactory.createWith(carl, weapons);
weaponsForCarl.place();
assertTrue(weaponsForCarl.isPlaced());
assertTrue(weaponsForCarl.hasSpecialShippingNeeds());
, Где делает фабрику, вписывается в следующую платформу: UI> Приложение> Domain> Сервис> Данные
Domain.
кроме того, потому что фабрика является единственным местом, допускал создание объекта would'nt, Вы получаете циклические ссылки, если Вы хотели создать свои объекты в Ваших данных и уровнях служб?
В моем примере, все зависимости вытекают от начала до конца. Я использовал Принцип Инверсии Зависимости (ссылка PDF) для предотвращения проблемы, о которой Вы говорите.
, Если роль класса фабрики для создания объекта затем, что имеют преимущества уровень служб?
, Когда у Вас есть логика, которая не вписывается ни в какой единственный объект области ИЛИ у Вас есть алгоритм, который включает организацию нескольких объектов области, используйте сервис. Сервис инкапсулировал бы любую логику, которая не помещается ни во что больше и делегирует к объектам области, где он действительно соответствует.
В примере я набросал здесь, я предполагаю, что придумывающий Маршрут для Порядка включил бы несколько объектов области. OrderFactory мог делегировать к такому сервису.
BTW, иерархией, которую Вы описали, должен, вероятно, быть UI> Приложение> Domain Services> Domain> Инфраструктура (Данные)
, я задал много вопросов и ценю любой ответ. Какой недостаток i'am является примером приложения, который демонстрирует, как все слои в домене управляемый дизайн-проект объединяются... Есть ли там что-нибудь?
Применение Domain Управляемый Дизайн и Шаблоны Jimmy Nilsson являются большим комплиментом Eric Evans Управляемый Доменом Дизайн . Это имеет много примеров кода, хотя я не знаю, существует ли акцент на разделение на уровни. Разделение на уровни может быть хитрым и является почти темой, отдельной от DDD.
В книге Evans, существует очень небольшой пример разделения на уровни, Вы могли бы хотеть проверить. Разделение на уровни является шаблоном предприятия, и Martin Fowler записал Шаблоны Архитектуры приложений для предприятия , который Вы могли бы найти полезным также.
Вероятно, в моей собственной опасности, я склонен не подчеркивать шаблоны разработки, если я действительно не застреваю. Я просто создаю систему, поскольку я думаю о ней и осуществляю рефакторинг, пока она не имеет некоторый смысл на следующий день.
я использую фабрику когда:
Парни DDD и я могли бы спорить об этом, но в основном идея того класса "фабрики" состоит в том, чтобы выпустить объекты области. объекты области затем получают доступ к данным и становятся частью "модели" домена, с которым Вы работаете.
Приложение содержит UI и т.д., это не иерархия наследования.
Быть осторожным с тем "видом" оператора; много людей думает это, потому что они наследование использования CAN, они ДОЛЖНЫ использовать наследование. Агрегирование ("содержит" или, "имеет" в противоположность, ""), часто лучшая ставка.
Не обязательно. Думайте о том, что домен говорит Вам: это - что-то как, "Мне нужен продукт, и я знаю номер продуктов продукта. Когда фабрика продукта сделана, я хочу быть данным полностью заполненный объект, который представляет мой продукт". Когда Вы создаете свой объект продукта, что это должно сделать, чтобы быть допустимым объектом продукта представление определенного продукта?
фабрика должна звонить непосредственно в репозиторий для получения его данных или сервисной библиотеки?
я сказал бы, что ни один, это должно быть передано информация, в которой это нуждается непосредственно если вообще возможный.
, Где делает фабрику, вписывается в следующую платформу: UI> Приложение> Домен> Сервис> Данные
Не уверенный, куда это разделение на уровни прибывает из, слои, не фиксируются в DDD, но я сказал бы, что Вы будете лучше всего фокусироваться на этом стиле
UI> Приложение> Домен
В Домене, у Вас затем есть несколько типов объектов, и я установил правила об отношениях между ними:
, Если роль класса фабрики для создания объекта затем, что имеют преимущества уровень служб?
Eric объясняет это вполне хорошо в книге, таким образом, я обратился бы к ней, но в конечном счете ее великое, если у Вас есть перекрестное совокупное поведение или поведение, которое не соответствует хорошо одному агрегату (например, пример учетной записи в книге).