我有一个由以下类和接口组成的基本设计:
- 一个
IRepository<TEntity>
界面, - 一个
Repository<TEntity>
基类, - 和一个具体的
TenantRepository
类。
问题”
由于接口继承的所有内容根据定义都具有公共访问权限,因此我可以调用该Add
方法(基类)
_tenantRepository.Add(new Tenant { Name = "blah" } );
虽然我应该调用该Create
方法TenantRepository
_tenantRepository.Create("blah");
问题
如果我能够将该Add
方法定义为受保护的,这样客户端代码就无法访问该方法,那就太好了,但这是不允许的,因为它是在接口中定义的一个方法并且必须具有公共访问权限。
或者,我可以将这些方法命名为相同的,以便我实际上覆盖具体类中的实现。这将阻止客户端代码Repository.Add
直接调用。但在某些情况下,我真的想阻止客户端代码调用基类中定义的方法。
另一种选择可能是这样写:
new protected void Add(Tenant tenant)
{
}
但这让我不寒而栗(当我开始重构方法名称时它很快就会崩溃)。
有没有更好的方法来实现这一目标?
一些代码片段作为参考:
界面:
public interface IRepository<TEntity> : IDisposable where TEntity : IEntity
{
IQueryable<TEntity> GetAll();
void Delete(TEntity entity);
void Add(TEntity entity);
}
基类的一小部分:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity
{
protected IDbContext Context;
public Repository(IDbContext context)
{
Context = context;
}
public void Add(TEntity entity)
{
DbSet.Add(entity);
}
// Left out other, for this question irrelevant, method implementations
}
最后TenantRepository
public class TenantRepository : Repository<Tenant>
{
public TenantRepository(IDbContext context)
: base(context)
{
}
public Tenant Create(string tenantName)
{
var tenant = new Tenant
{
Name = tenantName,
Guid = Guid.NewGuid().ToString()
};
if (Exists(tenant.Name))
{
throw new TenantAlreadyExistsException(tenant.Name);
}
Add(tenant);
return tenant;
}
// Left out other, for this question irrelevant, method implementations
}