Z mojego rozumienia CQRS stworzysz zestaw DTO spełniających wymagania ekranów interfejsu użytkownika lub aplikacji, które mogą wymagać ich użycia.
Jeśli istnieje w projekcie, opiera się na wymaganiach, ponieważ byłoby to uzależnione od ujawnienia tych DTO za pośrednictwem usług internetowych. W takim przypadku nie umieszczałbym go w warstwie WWW, lecz w warstwie aplikacji lub w specjalnej warstwie fasady.
Następnie można mieć repozytorium tylko do odczytu lub warstwę dostępu do danych, która bezpośrednio zapełnia DTO. Myślę, że strona Query rzeczy powinna być zoptymalizowana pod kątem wydajności odczytu, w którym to przypadku zadania bezpośrednie/procedury przechowywane na widokach baz danych lub tabelach i SqlDataReaders wykonałyby tutaj najlepszą robotę. Ale zdecydowanie warto byłoby wyodrębnić ten dostęp za interfejsem, aby można było dodać buforowaną implementację w dalszej części ścieżki.
Jeśli korzystasz z ORM i chcesz zmapować z Twoich Jednostek Domeny do DTO, możesz mieć ogólny QueryRepository, który ma metody, które wymagają ISpecification lub podobnej konstrukcji do zdefiniowania twoich zapytań, a następnie obiektu DtoAssembler do tworzenia Dtos z twoich obiektów domeny. Następnie implementacja ma obiekt pierwszej klasy dla każdego z zapytań, które zamierzasz wykonać.
Oto dość wymyślny przykład, ale mam nadzieję, że da ci to pomysł.
public interface ISpecification<T>
{
Expression<Func<T, bool>> Predicate { get; }
}
public class ActiveCustomersSpecification : ISpecification<Customer>
{
private Expression<Func<Customer, bool>> predicate;
public ActiveCustomersSpecification()
{
predicate = c => c.IsActive;
}
#region ISpecicfication<Customer> Members
public Expression<Func<Customer, bool>> Predicate
{
get { return predicate; }
}
#endregion
}
public interface IQueryRepository<T>
{
IQueryable<T> GetQuery(ISpecification<T> specification);
IEnumerable<T> FindAllBy(ISpecification<T> specification);
}
public class CustomerDtoAssembler
{
public CustomerDto AssembleFrom(Customer customer)
{
var customerDto = new CustomerDto
{
Id = customer.Id
};
return customerDto;
}
}
Właśnie natknąłem się na blogu przez JAK Charlton, który opisuje, dlaczego nie zdecydował się użyć DDD dla zapytań w ogóle: „Bok Zapytanie o CQS nie musi silnie typami jednostek, ani nie wymaga silnie wpisane DTOs - ponieważ w dużej mierze dane ad-hoc utrzymują te jednostki, a DTO pochłaniają nieproporcjonalnie długi czas opracowywania czegoś, co DataTable może poradzić sobie z więcej niż odpowiednio " http://devlicio.us/blogs/casey/archive/2009/ 06/22/my-are-not-doing-ddd-part-dwa-cqs.aspx – rohancragg