如何匹配不断变化的标准

时间:2016-12-22 17:59:22

标签: c# asp.net-mvc

我们说我有符合我的标准,但这个标准会随着时间而改变。这是我的意思的一个例子:

bool masterBool = false;

bool isTrue = true;
bool isAlsoTrue = true;
bool isTrueToo = true;

if (isTrue && isAlsoTrue && isTrueToo)
{
    masterBool = true;  
}

就像我说的那样,标准会不时改变。也许isTrue不再需要为真,但是引入了新标准needsToBeTrue。这将需要在方法中添加和删除变量以及复合条件。我想知道是否有另一种方法可以解决这个问题?这种方式对我来说似乎很草率。

谢谢

2 个答案:

答案 0 :(得分:1)

这听起来像是一个简单的bool字典,LINQ会为你解决问题:

var criteria = new Dictionary<string, bool>{
    {"oneCriterion", true},
    {"anotherOne", true},
    {"andAnotherOne", true}
};

//true!
var masterCriteria = criteria.All(x => x.Value);
Assert.IsTrue(masterCriteria);

criteria.Remove("oneCriterion");
criteria.Add("newCriterion", false);

//false
masterCriteria = criteria.All(x => x.Value);
Assert.IsFalse(masterCriteria);

答案 1 :(得分:0)

这在很大程度上取决于您的实现,以及您可以围绕它使用的框架。也许你正在使用依赖注入框架,在这种情况下,你可以实现一个处理决策的接口,并提供一个实现当前决策的实现

例如,您可以使用Microsofts UnityContainer并决定构建类似

的内容
public interface IConditionMaker {
    bool IsConditionTrue();
}

然后引用此接口,以便通过DI框架注入,您的类可能看起来像

public interface IExecutionClass {
    void TakeAction();
}

public class ExecutionClass : IExecutionClass {
    private readonly IConditionMaker _conditionMaker;

    public ExecutionClass(IConditionMaker conditionMaker) {
        _conditionMaker = conditionMaker;
    }

    public void TakeAction() {
        if (_conditionMaker.IsConditionTrue()) {
            // do your action
        }
    }

}

然后,您将进行第一次实施,如

public class ConditionMaker : IConditionMaker {
    public bool IsConditionTrue() {
        bool isTrue = true;
        bool isAlsoTrue = true;
        bool isTrueToo = true;

        return (isTrue && isAlsoTrue && isTrueToo);
    }
}

然后通过统一注册这些东西,比如

unityContainer.RegisterType<IConditionMaker, ConditionMaker>();
unityContainer.RegisterType<IExecutionClass, ExecutionClass>();

现在,每次需要IExecutionClass时(例如:内部控制器或其他点),它都可以通过注入框架解析并为您提供真正的实现,并且还将构造函数参数IConditionMaker解析为ConditionMaker。 / p>

如果您需要在代码中稍后更改某些内容,则可能只需要更改ConditionMaker实现,但其余代码可以保持不变。

.net框架有一个很好的例子,例如,ICommand,您可以在ICommand界面中实现,并具有类似

的内容
public MyCommand : ICommand {
    public event EventHandler CanExecuteChanged;

    public bool CanExecute( object parameter ) {
        return true; // always execute, or evaluate parameter and decide, or use injected members and make your decision
    }

    public void Execute( object parameter ) {
        // do your action, knowing that the CanExecute was already executed
    }
}

但是,这实际上取决于您可以使用的情况和框架。也许你最好使用一个简单的Predicate<T>列表,然后你可以枚举,例如:

// say you have some kind of argument, you can pass that argument along
if (predicateList.All(predicate => predicate( argument ))) {
    // all predicates succeeded, do your action
}

然后您只需要注册/取消注册当时适用的谓词