Базовый класс для общих классов?

Мы используем EF6 в нашем приложении MVC 4, поэтому мы создали абстрактный класс для бизнес-объектов
Итак, у нас есть следующий общий абстрактный класс:

public abstract class Repository<TEntity, TIdentifier> : IRepository<TEntity, TIdentifier> where TEntity : class { ... }

в нашем приложении BusinessLayer у нас есть несколько классов (по одному классу на сущность), которые реализуют вышеуказанный класс.
например: как показано ниже

    //Authorization is an entity here
    public class AuthorizationBusinessObject : MD.EntityFramework.Repository.Repository<Authorization, int>
    {
       ...
    }

Нам нужно иметь BaseBusinessObject для вышеуказанных классов.
Теперь мой вопрос здесь; как мы можем иметь класс BaseBusinessObject для вышеуказанных классов?

Изменить:

Ну, Repository<> — это базовый класс для BusinessObjects, не так ли?
На самом деле нам нужен не универсальный базовый класс для BusinessObjects
Почему?
Мы используем службы веб-API в нашем MVC 4. заявление. в каждом контроллере веб-API у нас должны быть те же действия, что и следующие, только BusinessObject отличается. Итак, если бы у нас был базовый бизнес-объект, мы могли бы реализовать следующие действия в базовом контроллере веб-API.

// Setting is an Entity
private readonly SettingBusinessObject _settingBusinessObject;

public SettingController()
{
    _settingBusinessObject = new SettingBusinessObject(Entities);
}

public Setting Get(int id)
{
    return _settingBusinessObject.SelectBy(id);
}
public List<Setting> Get(IEnumerable<int> ids)
{
    return _settingBusinessObject.SelectAll(ids).ToList();
}

public Setting Put(Setting setting)
{
    return _settingBusinessObject.Update(setting);
}
public List<Setting> Put(List<Setting> entities)
{
    List<Setting> userList = new List<Setting>();
    userList.AddRange(entities.Select(_settingBusinessObject.Update));
    return userList;
}

public Setting Post(Setting entity)
{
    return _settingBusinessObject.Insert(entity);
}
public List<Setting> Post(List<Setting> entities)
{
    List<Setting> userList = new List<Setting>();
    userList.AddRange(entities.Select(_settingBusinessObject.Insert));
    return userList;
}

public void Delete(int id)
{
    _settingBusinessObject.Delete(id);
}
public void Delete(List<int> ids)
{
    _settingBusinessObject.Delete(ids);
}

person Mohammad Dayyan    schedule 29.11.2013    source источник
comment
Так что же такое Repository<TEntity, TIdentifier> по отношению к классу AuthorizationBusinessObject, если он уже не является базой для этого class?   -  person Mike Perrenoud    schedule 29.11.2013
comment
@MichaelPerrenoud: см. раздел «Правка»   -  person Mohammad Dayyan    schedule 30.11.2013
comment
Решение, предоставленное @ChaseMedallion, по-прежнему будет работать, просто добавив интерфейс для их передачи как.   -  person Mike Perrenoud    schedule 30.11.2013


Ответы (1)


Почему класс BaseBusinessObject не может быть универсальным?

public abstract class BaseBusinessObject<TEntity, TIdentifier> : Repository<TEntity, TIdentifier>
{
    ... base stuff here
}

public class AuthorizationBusinessObject : BaseBusinessObject<Authorization, int>
{
}

Однако стоит отметить, что наложение большого количества вещей для каждой сущности поверх EF может добавить массу шаблонов с небольшой реальной пользой. Возможно, стоит подумать о том, даст ли вам то, что вам нужно, просто используя EF напрямую, или ваши классы бизнес-объектов должны быть организованы вокруг логических наборов операций, а не вокруг отдельных сущностей.

person ChaseMedallion    schedule 29.11.2013
comment
Спасибо за ответ, пожалуйста, смотрите раздел «Правка» в основном сообщении. - person Mohammad Dayyan; 30.11.2013
comment
@Mohammad: почему базовый контроллер API не может быть универсальным? Похоже, вам понадобится это, чтобы определить типы аргументов для многих методов? - person ChaseMedallion; 30.11.2013
comment
Можем ли мы иметь общие действия в веб-API? - person Mohammad Dayyan; 30.11.2013
comment
@Мохаммад: я не уверен на 100%, но попробовать стоит. В этом случае конечные контроллеры и действия на самом деле не будут универсальными, поскольку каждый конкретный тип контроллера будет реализовывать универсальный базовый контроллер с определенными типами для универсальных параметров. - person ChaseMedallion; 30.11.2013