Шаблон для общедоступных и внутренних интерфейсов на бизнес-объектах

72
9

Я хотел бы создать модель домена с использованием внутренних интерфейсов
а затем создать ограниченные публичные интерфейсы (для пользователей сборки)


Пока это возможно в CSharp, я продолжаю работать в грязном коде, связанном с параллельными интерфейсами:


public interface IAccount { IList<ITran> Transactions { get; } }
internal interface IAccountInternal : IAccount { IList<ITranInternal> Transactions { get; } }
internal class Account : IAccountInternal { }

здесь реализация учетной записи становится очень грязной, поскольку существует множество коллекций, которым нужны два интерфейса и т.д.


Кроме того, я хотел бы гарантировать, что публичные интерфейсы реализованы с использованием внутренних интерфейсов (в отличие от прямого доступа к конкретным классам)


Это должен быть общий сценарий, может ли кто-нибудь рекомендовать чистый подход?

спросил(а) 2011-06-12T11:36:00+04:00 9 лет, 5 месяцев назад
1
Решение
59

с использованием общей ковариации интерфейса в dot net 4.0 Мне удалось очистить вещи (обратите внимание на модификатор "out" на параметр T)


public interface IListReadOnly<out T> : IEnumerable<T> {
int Count { get; }
T this[int index] { get; }
}//class

это позволяет мне возвращать коллекции внутренних объектов, типизированных как общедоступные объекты, потому что:

public interface IPublic { }
internal interface IPrivate : IPublic { }

теперь это работает:


private IListReadOnly<IPrivate> list = ...
public IListReadOnly<IPublic> List { get { return list; } }

ответил(а) 2011-06-13T01:48:00+04:00 9 лет, 5 месяцев назад
43

Это кажется плохой идеей, эта модель кажется очень сложной.


Моя первая мысль - уменьшить потребность в внутренних интерфейсах. Если вы используете их для модульного тестирования, я бы рекомендовал только тестировать внешний (публичный) интерфейс и, по сути, полностью отказаться от использования внутренних интерфейсов.

Кроме того, если вы можете уточнить необходимость в модели внутреннего домена, это может помочь другим лучше ответить на ваш вопрос.

ответил(а) 2011-06-12T16:36:00+04:00 9 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема