2015-07-16 1 views
0

Учитывая следующее: -2 типа, которые представляют собой замкнутый общий тип IQueryHandler

public abstract class PriceBookDataViewModelQuery : IQuery<PriceBookDataViewModel> 
{ 
    public bool IsRenewal { get; set; } 
    public string Postcode { get; set; } 
} 


public class PriceBookDataSseElecViewModelQuery : PriceBookDataViewModelQuery 
{ 
} 


public class PriceBookDataSseGasViewModelQuery : PriceBookDataViewModelQuery 
{ 
} 

public interface IQueryHandler<in TQuery, out TResult> where TQuery : IQuery<TResult> 
{ 
    TResult Handle(TQuery query); 
} 

и в моем контейнере конфигурации у меня есть

Container.RegisterManyForOpenGeneric(
    typeof(IQueryHandler<,>), typeof(IQueryHandler<,>).Assembly); 

Мои обработчики запросов являются: -

public class PriceBookDataSseElecViewModelHandler : 
    IQueryHandler<PriceBookDataViewModelQuery, PriceBookDataViewModel> 

public class PriceBookDataSseGasViewModelHandler : 
    IQueryHandler<PriceBookDataViewModelQuery, PriceBookDataViewModel> 

Я получаю сообщение об ошибке:

Существует 2 типа, которые представляют закрытый тип типа IQueryHandler. Типы: PriceBookDataSseElecViewModelHandler и PriceBookDataSseGasViewModelHandler. Либо удалите один из типов или использовать перегрузку, которая принимает BatchRegistrationCallback делегат

Я понимаю, почему это происходит, когда у меня есть два типа, которые наследуют от того же IQueryHandler. Однако в конечном итоге у меня будет около 20 из этих запросов, которые будут содержать те же свойства, которые стремятся оставаться сухими.

Какие параметры у меня есть, кроме дублирования свойств в 20 классах запросов? Как использовать BatchRegistrationCallback в моем сценарии?

+0

Что произойдет, если вы переместите ссылку интерфейса IQuery 'для каждого подкласса? – Will

+0

Просьба показать обработчики запросов. – Steven

+0

Добавлены обработчики запросов – Rippo

ответ

2

Со страхом быть немного запутался об этом вопросе, Вот что я должен сказать:

Я понимаю, почему это происходит, когда у меня есть два типа, которые наследуют от того же IQueryHandler. Однако в конечном итоге у меня будет около 20 из этих запросов, которые будут содержать те же свойства, которые стремятся оставаться сухими.

Если у вас есть несколько обработчиков с одинаковыми свойствами, почему бы просто не перемещать общие свойства в абстрактном классе и не определять отдельные и уникальные обработчики?

Иногда мне нравится думать «СУХОЙ», как «Do Repeat Yourself», если он работает, и его легко поддерживать и понимать, повторите сами. Неважно, у вас 10 классов больше, поскольку они разделены на единую ответственность.

public abstract class PriceBookDataViewModelQuery { 

    public bool IsRenewal { get; set; } 
    public string Postcode { get; set; } 
} 

public PriceBookDataSseElecViewModelQuery 
    : IQuery<PriceBookDataViewModel>, PriceBookDataViewModelQuery { 

    // Extra properties 
} 

public class PriceBookDataSseGasViewModelQuery 
    : IQuery<PriceBookDataViewModel>, PriceBookDataViewModelQuery 
{ 
    // Extra properties 
} 

// First handler 
public class PriceBookDataSseElecViewModelHandler 
    : IQueryHandler<PriceBookDataSseElecViewModelQuery, PriceBookDataViewModel> 
{ 
} 

// Second handler 
public class PriceBookDataSseGasViewModelHandler 
    : IQueryHandler<PriceBookDataSseGasViewModelQuery, PriceBookDataViewModel> 
{ 
}