继承类方法的可见性没有意义



以下代码表示我在工作单元中所做的工作。

接口:

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 )
    {}
    // ...

混凝土通用存储库:

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内部的评论,我可以在上看到它们

是什么阻止了继承类显示其方法?

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));

最新更新