Я дам вам немного контекста первыйКак перегрузить/заменить/продлить C# Интерфейс, используемый в общем коде
Моя компания выбрала подход к проектированию для наших приложений (окна услуг), чтобы позволить большему количеству повторного использования кода за счет централизации (внутренний nuget repo) основного кода. Это упрощает ведение тестирования и создание новых сервисов до сих пор.
По существу, все службы используют SqlDependency для получения уведомления из базы данных, которая доступна для обработки. Когда объект SqlDependency получает уведомление, что вызывает следующий
public interface IRequestReceiver : IDisposable
{
IEnumerable<IRequest> GetRequests(int maxRequestNumber);
}
, которая осуществляется независимо каждым приложением, и, следовательно, позволяет каждому приложению получать его запросы от него известно местоположение и обработать их и т.д.
Теперь для задачи
Все это хорошо работало до недавнего времени, так как все IRequest были очень похожими, и поэтому мы могли использовать один интерфейс IRequest в общем коде, но каждый раз вводил в него различную логику обработки. к сожалению, мне поручена задача создания новой службы, реализация которой IRequest значительно отличается от всех предыдущих.
Моя проблема заключается в том, что я не могу изменить IRequest, поскольку он используется несколькими живыми службами, и я обязан придерживаться шаблона проектирования наших существующих сервисов, но я должен включать дополнительные ресурсы сервера в IRequest, которых раньше не было, и не имеет отношения к существующим услугам.
И, наконец, мой вопрос
Учитывая, я знаю, что интерфейс представляет собой договор, и поэтому не должен быть перегружен, как бы я перегрузить или расширить или даже заменить существующий IRequest интерфейса для всего этого нового сервиса, не подвергая нерелевантные свойства к существующим услугам.
Ниже приведены образцы существующего и нового IRequest интерфейса
Existing
public interface IRequest
{
int Id { get; }
string CreatedBy { get; }
bool IsActive { get; set; }
DateTimeOffset CreatedDateTime { get; set; }
string LastUpdatedBy { get; set; }#
DateTimeOffset LastUpdatedDateTime { get; set; }
IRequestDetail Detail { get; }
bool Process(CancellationToken token);
}
Новый
public interface IRequest
{
int Id { get; }
string CreatedBy { get; }
bool IsActive { get; set; }
DateTimeOffset CreatedDateTime { get; set; }
string LastUpdatedBy { get; set; }#
DateTimeOffset LastUpdatedDateTime { get; set; }
int NotificationId { get; set; }
int StatusId { get; set; }
string StatusCode { get; set; }
string StatusMessage { get; set; }
string Destination { get; set; }
string BusinessProcessCode { get; set; }
string MsgType { get; set; }
string MessageId { get; set; }
bool Process(CancellationToken token);
}
Как вы можете видеть, это просто дополнительные свойства, но я не хотел бы, чтобы начать вводя их в существующий интерфейс IRequest.
Спасибо
Новый интерфейс и использовать его для частей, которые требуют новых свойств. Для получения дополнительной информации читайте здесь: http://stackoverflow.com/questions/8042/extension-interface-patterns – sr28
sr28 Я не уверен, что это применимо в качестве расширений - это методы? в то время как я особенно фокусируюсь на свойствах, которые я хочу расширить. спасибо – GuildBK