2013-07-08 2 views
0

Работа над некоторыми designoptions для приложения mvc + web api. Вопрос, который я хотел бы задать, является более или менее «как бы вы сделали это лучше, или это звук ниже».Дизайн шаблона для общего контроллера/служб

У нас есть две службы, одна грубая и одна, для тех, у кого есть поддержка расширенных методов. мы должны иметь общие контроллеры, предоставляющие функциональность в соответствии с услугами. Например, упрощенное упрощение.

Примечание: ICrudService - это интерфейс для CrudService, а IExtendedCrudService наследует ICrudService.

public class CrudService<T> 
{ 
    protected readonly IUnitOfWork UnitOfWork; 

    public CrudService(IUnitOfWork unitOfWork) 
    { 
     UnitOfWork = unitOfWork; 
    } 
    //Methods for crud and so forth 
} 

public class ExtendedCrudService<T> : CrudService<T> 
{ 
    public ExtendedCrudService(IUnitOfWork unitOfWork) : base(unitOfWork) 
    { 
    } 
    //Methods for extended functionality 
} 

public abstract class ControllerBase<T> 
{ 
    private readonly ICrudService<T> _crudService; 

    public ControllerBase(ICrudService<T> crudService) 
    { 
     _crudService = crudService; 
    } 
    //Actions for crud stuff 
} 

public abstract ExtendedControllerBase<T> : ControllerBase<T> 
{ 
    private readonly IExtendedCrudService<T> _extCrudService; 

    public ExtendedControllerBase(IExtendedCrudService<T> extCrudService) : base(extCrudService) 
    { 
     _extCrudService = extCrudService; 
    } 
    //Action for extended stuff 
} 

Все расширенные объекты будут использовать один и тот же материал, как и никакие расширения наследования контроллера. Используется Mapping = Automap и DI. Так бы вы сделали это по-другому, если да, то как и почему? Попытка понять, что в основном используется для этих сценариев, поэтому все материалы глубоко оценены.

ответ

1

Я использую этот шаблон дизайна совсем немного. Использование интерфейсов позволяет упростить (на мой взгляд) модульное тестирование. Я бы рекомендовал создавать интерфейсы для всех ваших сервисов, а в классе, который реализует службу, создать два конструктора - один, который берет все необходимые интерфейсы, как вы уже выше, но также конструктор по умолчанию, который принимает новый класс, - используя ваши CrudService в качестве примера, я хотел бы также поставить в следующем:

public CrudService() : this(new UnitOfWork()) 
{ 
} 

Это позволит вам использовать без параметров конструкторов, а также параметризованные конструкторы.