我在POCO实体中设置了一个方法,用于设置基本属性和导航属性。在某些情况下,我不需要验证某些条件,但在另一种情况下,我需要验证以确保数据库中的信息一致,但此验证使我从数据库中获取额外的数据。
所以到目前为止我的基本方法是:
public void setMyProperty(MyType paramProperty)
{
this.Property = paramProperty;
this.IDProperty = paramProperty.IDPorperty;
paramProperty.MyNavigationCollection.Add(this);
}
对于验证数据的方法,我想我有两个选择。
首先,我可以为业务逻辑创建一种新方法,类似于:
public void setPropertyBi(MyType paramProperty)
{
//check conditons
//If all OK then
this.setPorperty(paramProperty);
}
但我有另一个选择,只使用一种方法,而不是基本方法,另一种方法用于业务检查。这样的事情:
public void setProperty(MyType paramType, bool paramDoChecks)
{
if(paramDoChecks)
{
//Do checks
}
//if all OK
this.Property = paramProperty;
this.IDProperty = paramProperty.IDPorperty;
paramProperty.MyNavigationCollection.Add(this);
}
推荐选项是哪个?或者还有其他方法?
答案 0 :(得分:3)
这里的人似乎更喜欢国旗,我个人认为这很可怕 你想要实现两件事:只需设置一个属性;验证并设置属性。恕我直言,它应该是两种分开的方法。
答案 1 :(得分:0)
如果它是一个equaly功能,请不要写两个不同的方法。只需添加一个参数,它就像你上次写的那样产生验证差异。 但如果验证失败,请不要忘记输入行为。将它分开。
答案 2 :(得分:0)
您可以向passport.serializeUser(function(user, done) {
//We can identify the user uniquely by the CN,
//so we only serialize this into the session token.
done(null, user.cn);
});
passport.deserializeUser(function(cn, done) {
//Directly query LDAP.
//I'm not sure passport caches the result (only calls deserializeUser for new sessions)
//but worst case you can cache the result yourself.
somehowLoadUserFromLDAPByCN(cn, function(err, user) {
done(err, {
userId: user.cn,
displayName: user.displayName
});
});
});
添加一个布尔ValidationRequired
属性,您可以在调用MyType
之前设置该属性。
答案 3 :(得分:0)
我更喜欢有两种方法: CanSetProperty 和 SetProperty 。
我认为此代码是遵循Command Query Separation Pattern
的合适人选基本思想是我们应该将对象的方法划分为 两个截然不同的类别:
- 查询:返回结果,不要更改结果的可观察状态 系统(没有副作用)。
- 命令:更改a的状态 系统但不返回值。