Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继承类方法的可见性没有意义?_C#_Entity Framework_Inheritance_Repository Pattern_Unit Of Work - Fatal编程技术网

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

C# 继承类方法的可见性没有意义?,c#,entity-framework,inheritance,repository-pattern,unit-of-work,C#,Entity Framework,Inheritance,Repository Pattern,Unit Of Work,下面的代码表示我在一个工作单元上的工作 接口: public interface IUnitOfWork { IFieldRepository FieldRepository { get; } void Save(); } public interface IFieldRepository { IEnumerable<Field> GetAllFields( int page, int amount, string sortByKey, SortDirect

下面的代码表示我在一个工作单元上的工作

接口:

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();
    }
}
混凝土现场储存库:

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();
    }
}
当我无法从控制器中访问应从我的
存储库继承的方法时,就会出现问题

如果您查看
EFUnitOfWork.FieldRepository
中的注释,我可以在该点上看到它们


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

unitOfWork.FieldRepository
具有类型
IFieldRepository
,因此只有
GetAllFields()
可见:

IFieldRepository repository = unitOfWork.FieldRepository;
repository.GetAllFields();
您需要将其强制转换为
EFGenericRepository,IFieldRepository
(不要这样做!),或者将此方法添加到界面:

public interface IFieldRepository
{
    void Insert(Field entity);
}
虚拟化在这里没有任何区别,您可以将其删除


但我会为所有存储库提供一个通用接口:

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

控制器中的代码是什么样子的?我现在已将控制器添加到OPC中。您的
Insert
方法在您描述的代码中不应可见。您的字段类型为
IFieldRepository
。。它不会在其契约中公开
Insert
方法-因此,您所说的是不正确的。您的代码在此处不正确。。或者你的智能感知是不正确的。谢谢,伙计,我刚才的问题太傻了。好的,我会这样做的。。。非常感谢!工作单元看起来正确吗?另请看,因为您使用
SortDirection
来表示订单方向,而且有更好的方法来实现它。@Jimmyt1988:我不确定您是否需要工作单元,它看起来像是一个不必要的层。我只需将
I存储库
注入
t控制器
(即将FieldRepository注入FieldController),并将DataContext直接注入存储库。@Jimmyt1988:您可以将
sortByKey
替换为
Func f.SomePropertyOfField
@Jimmyt1988:并将
SortDirection
替换为
Func
,因此它将是
seq=>seq.OrderBy(prop)
seq=>seq.OrderByDescending(prop)
其中
prop
是上一条注释中的属性选择器。