所以,我有这个班级
public abstract class Entity<T> : IEntity<T>, IAuditableEntity,ISoftDeletable where T : struct
{
public T Id { get; set; }
public DateTime CreatedDate { get; set; }
public string CreatedBy { get; set; }
public DateTime UpdatedDate { get; set; }
public string UpdatedBy { get; set; }
public bool Deleted { get; set; }
}
,在这一行允许我创建像
这样的类public class User : Entity<int>
{
public string Username { get; set; }
public string Password { get; set; }
public byte LoginTypeId { get; set; }
public virtual LoginType LoginType { get; set; }
}
这将由像这样的存储库操纵:
public abstract class Repository<TEntity,TKey> : IRepository<TEntity, TKey> where TEntity : Entity<TKey> where TKey : struct
{
protected DbContext Context;
protected readonly IDbSet<TEntity> Set;
protected Repository(DbContext context)
{
Context = context;
Set = Context.Set<TEntity>();
}
public TEntity Get(TKey key)
{
return Set.FirstOrDefault(o => o.Id.Equals(key));
}
public virtual IEnumerable<TEntity> GetAll()
{
return Set.AsEnumerable();
}
}
目标是这将在一些WebApi2控制器中使用,但是由于良好的规则规定我不应该公开User类(并且我不允许)。
我的要求是基本属性(Id,Datetime,Deleted等)在控制器级别只读取,但显然在存储库级别读/写。
例如,控制器无法直接设置Deleted属性,但在调用Delete操作时必须由存储库设置。
我可以隐藏继承的属性,但我不能禁止任何人做
var u= new User();
var baseEntity = (Entity<int>) u;
那么,如何在控制器级别将具有基本属性的User实体作为只读?
答案 0 :(得分:1)
使用webapi项目中的视图模型仅显示所需的数据。请参阅此相关问题Does it Make Sense to have ViewModels in the Webapi?
答案 1 :(得分:0)
假设Entity
,Controller
和Repository
位于不同的项目中,一种可能的方法是使用InternalsVisibleToAttribute类。
您首先要将Repository
项目仅显示的所有属性更改为internal
属性。然后,您将使用InternalsVisibleTo
类,以便它们对该项目可见。
但是,在这种情况下,Entity
所在的项目仍然可以看到它们。