加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 何时公开IEnumerable而不是ICollection?

发布时间:2020-12-15 19:49:24 所属栏目:asp.Net 来源:网络整理
导读:public class Order{ public int Id {get;set;} [DisplayName("User")] public long UserId { get; set; } [ForeignKey("UserId")] public virtual User User { get; set; } public decimal Amount { get; set; }} 有了IEnumurable public class User{ publi
public class Order
{
 public int Id {get;set;}
 [DisplayName("User")]
 public long UserId { get; set; }
 [ForeignKey("UserId")]
 public virtual User User { get; set; }
 public decimal Amount { get; set; }
}

有了IEnumurable

public class User
{
 public int Id{get;set;}
 public virtual IEnumerable<Order> Orders { get; set; } 
}

public User GetWithOrders()
{
 var myUser=UserRepository.GetByEmail("email@email.com");
 myUser.Orders=OrderRepository.GetByUserId(myUser.Id);
 return myUser;
}

使用ICollection

public class User
{
 public int Id{get;set;}
 public virtual ICollection<Order> Orders { get; set; } 
}

public User GetWithOrders()
{
 var myUser=UserRepository.GetByEmail("email@email.com");
 return myUser;
}

我没有使用IEnumerable进行导航属性的延迟加载.因此,我必须使用另一个查询获取此用户的订单.

我有ICollection的导航.所以我可以接到用户的订单.这看起来很酷.但是,我可以在Controller中向用户添加新订单,而无需使用服务或存储库.

它是在控制器级别上操纵数据.这是反模式吗?

解决方法

But [with ICollection] I can add new order in Controller without using service or repository.

你的意思是你可以这样做(假设有一个用于向用户添加订单的视图模型和某个地方的SaveChanges()):

public class UserController
{
    public ActionResult AddUserOrder(AddUserOrderModel addOrder)
    {
        User user = User.GetByEmail(addOrder.UserEmail);        
        user.Orders.Add(addOrder.Order);
        User.SaveChanges();
    }
}

尤其是你可以执行user.Orders.Add(…),那么这就是从服务或存储库层公开实体类型的副作用.

如果要避免这种情况,则必须定义并公开包含要公开的成员的业务对象:

public class UserBLL
{
    public int Id { get; private set; }
    public IEnumerable<Order> Orders { get { return _orders.AsEnumerable(); } }
    private IEnumerable<Order> _orders;

    public UserBLL(User user)
    {
        Id = user.Id;
        _orders = user.Orders;          
    }

    public void AddOrder(Order order)
    {
        _orders.Add(order);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读