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
是上一条注释中的属性选择器。