我试图在提取方法中提取出常见的代码模式,但是找不到Presenter类型的正确类型。有帮助吗?
public bool CanGotoHome
{
get { return !(CurrentPresenter is IHomePresenter) && IsLoggedIn; }
}
public bool CanGotoImportanceOfAimsAndObjectives
{
get { return !(CurrentPresenter is IImportanceOfAimsAndObjectivesPresenter) && IsLoggedIn; }
}
public bool CanGotoGotoAimsAndObjectives
{
get { return !(CurrentPresenter is IAimsAndObjectivesPresenter) && IsLoggedIn; }
}
答案 0 :(得分:13)
使用泛型
private bool SomeFuncName<T>()
{
return !(CurrentPresenter is T) && IsLoggedIn;
}
用法:
public bool CanGotoGotoAimsAndObjectives {
get { return SomeFuncName<IAimsAndObjectivesPresenter>(); }
}
答案 1 :(得分:2)
对我而言,如果对象只知道它应该如何行动,那似乎会更容易。
class BasePresenter
{
public bool CanGotoHome
{
get { return IsLoggedIn; }
}
}
class HomePresenter : BasePresenter
{
public bool CanGotoHome
{
get { return False; }
}
}
然后对其他方法做同样的事情。这似乎更简单,更清晰。
答案 2 :(得分:1)
这段代码看起来很奇怪...如果只有那3行,为什么还要创建一个通用方法来重构它们呢?它不会为你节省那么多重复。
OTOH,如果有更多,那么此代码看起来像典型的功能/权限查询。如果你有超过3种类型,并且这些功能在其他情况下可能会变得更复杂,那么为什么不将它们加载到presenter_capabilities
数据库表中(如果你在企业系统中,甚至AD也加载...) ?检查“基于能力的安全性”是否不是您真正想要的。
至于代码本身,我会选择以下内容:
public bool GetCapability(Caps cap) {
return IsLoggedIn && CapabilityResolver.Check(CurrentPresenter, cap);
// or even
// return CapabilityResolver.Check(CurrentPresenter, cap, IsLoggedIn);
}
// usage
whatever.GetCapability(Caps.CanGoHome);
如果规则变得更复杂,或者添加任何新的大写/接口,则可以避免重新编译。如果它们非常静态,你可以通过一些哈希来解决它们。
答案 3 :(得分:1)
基于代码示例,我有点想在这里使用内置的主体/角色定义,以及一些字符串常量:
static bool IsInRole(string role) {
if (string.IsNullOrEmpty(role)) return true;
IPrincipal principal = Thread.CurrentPrincipal;
return principal == null ? false : principal.IsInRole(role);
}
public bool CanGotoHome
get { IsInRole(AccessRights.GotoHome); }
}
虽然这可能只是将责任转移到创建适当的自定义主体......