如何在mvc中更改业务模型属性可访问性

时间:2015-10-30 18:07:42

标签: c# .net asp.net-mvc inheritance asp.net-web-api2

所以,我有这个班级

 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实体作为只读?

2 个答案:

答案 0 :(得分:1)

使用webapi项目中的视图模型仅显示所需的数据。请参阅此相关问题Does it Make Sense to have ViewModels in the Webapi?

答案 1 :(得分:0)

假设EntityControllerRepository位于不同的项目中,一种可能的方法是使用InternalsVisibleToAttribute类。

您首先要将Repository项目仅显示的所有属性更改为internal属性。然后,您将使用InternalsVisibleTo类,以便它们对该项目可见。

但是,在这种情况下,Entity所在的项目仍然可以看到它们。