программирование структуры сущности в соответствии с шаблоном интерфейса и репозитория - PullRequest
1 голос
/ 31 марта 2012

Я занимаюсь разработкой в ​​ASP.NET MVC3 и EntityFramework.

Я хочу, чтобы моя модель соответствовала интерфейсу:

public class Account : IAccount
{
    public string Id { get; set; }

    public DateTime Date { get; set; }

    public string Language { get; set; }
}

public interface IAccount
{
    string Id { get; set; }

    DateTime Date { get; set; }

    string Language { get; set; }
}

Вот мой контекст

public class EFContext : DbContext, IContext
{
    public DbSet<Account> Accounts { get; set; }
}

А вот и хранилище:

* * 1010

Теперь я хочу использовать IRepository<IAccount>, но это запросит контекст для DbSet<IAccount>. Это приводит к ошибке, так как контекст содержит DbSet<Account>.

Затем я попробовал решение, предложенное здесь для Linq2Sql: http://iridescence.no/post/Linq-to-Sql-Programming-Against-an-Interface-and-the-Repository-Pattern.aspx

Поэтому я добавил эту функцию в свой EFContext

public new DbSet<T> Set<T>() where T : class
{
    var ciccio = TableMaps[typeof(T)];
    return (DbSet<T>)base.Set(ciccio).Cast<T>();
}

Но это не работает.

У кого-нибудь есть предложение? Thx

Ответы [ 2 ]

3 голосов
/ 31 марта 2012

Какую выгоду вы получаете от использования интерфейса для ваших сущностей? Я не вижу здесь никакой ценности. Обычно вы используете интерфейсы для удаления зависимостей от реализации, но это не то, чего вы добиваетесь здесь, потому что вы возвращаете конкретный набор объектов DbSet.

Ваши существа уже являются Поко. У них нет зависимостей от других реализаций, и у них нет кода в них, кроме getter / setter. Использование интерфейса является излишним и бессмысленным.

0 голосов
/ 01 апреля 2012

Я нашел обходной путь.Мне это нравится, поэтому я хочу поделиться этим.

Я переписал свой EFRepository:

public class EFRepository<T, W> : 
IRepository<T> where T : class
    where W : class, T
{
    private EFContext _context;

    public EFRepository(IUnitOfWork uow)
    {
        this._context = (EFContext)uow.Context;
    }

    protected DbSet<W> DbSet
    {
        get
        {                
            return _context.Set<W>();
        }
    }

    public IQueryable<T> All
    {
        get
        {
            return DbSet.AsQueryable<T>();
        }
    }

    public virtual int Count
    {
        get
        {
            return DbSet.Count();
        }
    }

    public bool Contains(Expression<Func<T, bool>> predicate)
    {
        return All.Count(predicate) > 0;
    }

    public virtual void Create(T item)
    {
        DbSet.Add(item as W);
    }

    public virtual void Update(T TObject)
    {
        var item = DbSet.Attach(TObject as W);

        _context.SetItemState(TObject, EntityState.Modified);
    }

    public virtual void Delete(Expression<Func<T, bool>> predicate)
    {
        var objects = All.Where(predicate);

        foreach (var obj in objects)
        {
            DbSet.Remove(obj as W);
        }
    }

    public virtual void Delete(T TObject)
    {
        DbSet.Remove(TObject as W);
    }
}

Так что теперь все, что мне нужно сделать сейчас, это

IRepository<IAccount>> accRepository = new EFRepository<IAccount, Account>(uow);

Я доволен этим решением, но все же я 'Я не уверен, что это лучший, поэтому любые комментарии будут оценены.

Спасибо

...