1

Следующий код представляет мои усилия в Единице работы.Видимость методов унаследованного класса не имеет смысла?

Интерфейсы:

public interface IUnitOfWork 
{ 
    IFieldRepository FieldRepository { get; } 
    void Save(); 
} 

public interface IFieldRepository 
{ 
    IEnumerable<Field> GetAllFields(int page, int amount, string sortByKey, SortDirection sortDirection); 
} 

Бетонный блок работы класса:

public class EFUnitOfWork : IDisposable, IUnitOfWork 
{ 
    private EFDbContext context = new EFDbContext(); 

    private IFieldRepository fieldRepository; 

    public IFieldRepository FieldRepository 
    { 
     get 
     { 

      if(this.fieldRepository == null) 
      { 
       this.fieldRepository = new EFFieldRepository(context); 
       // At this point i can see this.fieldRepository.Insert() absolutely fine 
      } 
      return fieldRepository; 
     } 
    } 

    // ... 

Бетонный хранилище Область:

public class EFFieldRepository : EFGenericRepository<Field>, IFieldRepository 
{ 
    public EFFieldRepository(EFDbContext context) 
     : base(context) 
    {} 

    // ... 

Бетон Generic хранилище:

public class EFGenericRepository<TEntity> where TEntity : class 
{ 
    internal protected EFDbContext context; 
    internal protected DbSet<TEntity> dbSet; 

    public EFGenericRepository(EFDbContext context) 
    { 
     this.context = context; 
     this.dbSet = context.Set<TEntity>(); 
    } 

    public virtual void Insert(TEntity entity) 
    { 
     dbSet.Add(entity); 
    } 

    // ... 

класс контроллера:

public class FieldController : Controller 
{ 
    IUnitOfWork unitOfWork; 

    public FieldController(IUnitOfWork unitOfWork) 
    { 
     this.unitOfWork = unitOfWork; 
    } 

    // GET: Field 
    public ActionResult List() 
    { 
     unitOfWork.FieldRepository.Insert(...); // This method isn't visible? But GetAllFields is visible 
     return View(); 
    } 
} 

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

Если вы посмотрите на комментарии внутри EFUnitOfWork.FieldRepository, я могу видеть их в этой точке

Что мешает унаследованный класс, отображающий его методы?

+0

Как выглядит код в контроллере? – abatishchev

+0

Теперь я добавил контроллер к OP – Jimmyt1988

+0

Ваш метод 'Insert' должен быть невидимым в точке кода, который вы описываете. Ваше поле имеет тип 'IFieldRepository' .., который не раскрывает метод' Insert' в своем контракте, поэтому вы говорите, что это неправильно. Ваш код здесь либо неверен, либо ваш Intellisense неверен. –

ответ

2

unitOfWork.FieldRepository имеет тип IFieldRepository так только GetAllFields() видна:

IFieldRepository repository = unitOfWork.FieldRepository; 
repository.GetAllFields(); 

Вы должны либо привести его к EFGenericRepository<Field>, IFieldRepository (не делают это!) Или добавить этот метод интерфейса:

public interface IFieldRepository 
{ 
    void Insert(Field entity); 
} 

Быть virtual здесь не имеет значения, вы можете удалить его.


Но вместо этого я должен был бы общий интерфейс для всех хранилищ:

public interface IRepository<T> 
{ 
    IEnumerable<T> GetAll(int page, int amount, string sortByKey, SortDirection sortDirection); 
} 

или его улучшенную версию модифицирована для работы с EF:

public interface IRepository<T> 
{ 
    IEnumerable<T> GetAll(); 

    IEnumerable<T> GetAll(int page, int amount, Expression<Func<IQueryable<T>, Func<T, object>, IEnumerable<T>>> sort); 
} 

Использование:

repository.GetAll(x, y, (seq, p) => seq.OrderBy(p => p.Name)); 
+0

Спасибо, человек, был немым с моим последним вопросом. Хорошо, сделаю это тогда ... большое спасибо! Правильно ли работает единица измерения? – Jimmyt1988

+0

Также см. Http: //www.codeproject.com/Articles/246361/Handle-GridView-OnSorting-using-LINQ, потому что вы используете 'SortDirection' для направления заказа, и есть намного лучшие способы сделать это. – abatishchev

+0

@ Jimmyt1988: Я не уверен, что вам нужна единица работы здесь вообще, это похоже на ненужный слой. Я бы ввел только «IRepository » в «TController» (например, FieldRepository в FieldController) и ввел DataContext непосредственно в репозиторий. – abatishchev