общедоступный T Add <T>(T entity) |У меня есть три типа коллекций, как узнать, какой объект добавить? - PullRequest
0 голосов
/ 09 октября 2011

У меня есть интерфейс IRepository для абстрагирования моего репозитория:

Поддельный репозиторий

public class Repository : IRepository
{
    IQueryable<User> _users;
    public IQueryable<User> Users
    {
        get
        {
            return _users ?? (_users = Enumerable.Empty<User>().AsQueryable());
        }
    }

    IQueryable<Couple> _couples;
    public IQueryable<Couple> Couples
    {
        get
        {
            return _couples ?? (_couples = Enumerable.Empty<Couple>().AsQueryable());
        }
    }

    IQueryable<Role> _roles;
    public IQueryable<Role> Roles
    {
        get
        {
            return _roles ?? (_roles = Enumerable.Empty<Role>().AsQueryable());
        }
    }

    public T Add<T>(T entity) where T : class
    {
        throw new System.NotImplementedException(); //Problem here!!
    }
}

Мне нужно знать, как добавить объект в нужную коллекцию в мою подделку репозитория?

В моем хранилище базы данных у меня нет этой проблемы:

Репозиторий базы данных

public class Repository : DbContext, IRepository
{
    public DbSet<Role> Roles { get; set; }
    public DbSet<User> Users { get; set; }
    public DbSet<Couple> Couples { get; set; }

    public T Add<T>(T entity)
        where T : class
    {
        return Set<T>().Add(entity);
    }
... //More...
}

Я знаю, что коллекции не одного типа, скрыл эту реализациюсократить код.

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

Ответы [ 3 ]

1 голос
/ 09 октября 2011

Я думаю, что это просто вопрос проверки типа entity:

public T Add<T>(T entity) where T : class 
{ 
    if (entity.GetType() == typeof(User))
    {
        // add user
    }
    else if (entity.GetType() == typeof(Couple))
    {
        // add couple
    }
    else if (entity.GetType() == typeof(Role))
    {
        // add role
    }
} 

Редактировать

ДонНе думаю, что вы сможете добавить сущности в _users, _roles и _couples, если они созданы с использованием Enumerable.Empty<T>().Вы могли бы рассмотреть

List<User> _users = new List<User>();

public IQueryable<User> Users
{
    get { return _users.AsQueryable(); }
}
0 голосов
/ 10 октября 2011

Лично я считаю, что смысл репозитория - описать корень домена для конкретной сущности и быть конечной точкой между логикой ведения бизнеса и устойчивостью данных. И у вас должен быть один репозиторий на корень домена.

Но в любом случае, посмотрите на эту статью, http://huyrua.wordpress.com/2010/07/13/entity-framework-4-poco-repository-and-specification-pattern/, Я многому научился из нее.

А чтобы ответить на ваш вопрос, вы можете сделать следующее:

    public virtual void Add(TEntity entity)
    {
        if (entity == null)
        {
            throw new ArgumentNullException("entity");
        }
        // add caching here
        var set = Context.CreateObjectSet<TEntity>();
        set.AddObject(entity);           
    }

Где Context - это ваш класс Entity Framework ObjectContext.

0 голосов
/ 09 октября 2011

Я бы изменил интерфейс IRepository на общий:

interface IRepository<T>
{
    IQueryable<T> Get();
    T Add(T item);
}

Если вы пойдете по этому маршруту, ваши юнит-тесты и макеты станут очень простыми, когда вы тестируете UserRepository, CoupleRepository и RoleRepository отдельно.

...