C# 如何为我的需求使用规范模式?

C# 如何为我的需求使用规范模式?,c#,design-patterns,specification-pattern,C#,Design Patterns,Specification Pattern,我已经阅读了一些规范模式的示例,但很难理解如何使用此模式实现 我正在为一个客户开发一个庞大的程序。我需要从特定的银行导入XML文件,然后对每个文件进行验证。分类账代码有不同的方法(SUB、bo、rcc)。因此,当文件读取SUBS时,它应该发送给SUBS方法 示例如下: 接口: 布莱克班克 蓝银行 雷德班克 分类账代码: 潜艇 博 碾压混凝土 结果: 布莱克班克有潜艇、BO和RCC 蓝班克有潜艇 RedBank有BO和RCC 你能给出一些示例代码或给我指出正确的方向吗?没有上下文,这很

我已经阅读了一些规范模式的示例,但很难理解如何使用此模式实现

我正在为一个客户开发一个庞大的程序。我需要从特定的银行导入XML文件,然后对每个文件进行验证。分类账代码有不同的方法(SUB、bo、rcc)。因此,当文件读取SUBS时,它应该发送给SUBS方法

示例如下:

接口:

  • 布莱克班克
  • 蓝银行
  • 雷德班克
分类账代码:

  • 潜艇
  • 碾压混凝土
结果:

  • 布莱克班克有潜艇、BO和RCC
  • 蓝班克有潜艇
  • RedBank有BO和RCC

你能给出一些示例代码或给我指出正确的方向吗?

没有上下文,这很难回答,因此我将尝试围绕我掌握的信息编造一些东西,希望它能给你一个想法

创建一个简单的规范接口,如下所示

interface ISpecification<T>
{
    IsSatisfiedBy(T obj);
}
和一个账本代码枚举

[Flags]
enum LedgerCodes
{
    SUBS, BO, RCC
} 
您可以制定一个简单的分类账代码规范,以检查IBank的分类账代码(这是一个非常通用的规范,您需要根据自己的需要制定它)

web上有一些很好的例子,添加了扩展方法,也覆盖了操作符,以提供一个简洁且更自然易读的规范,例如

class MessageSpecification : Specification<string>
{
    public const int MIN_LENGTH = 5;
    public const int MAX_LENGTH = 60;

    public override bool IsSatisfiedBy(string s)
    {
        Specification<string> length = new LengthSpecification(MIN_LENGTH, MAX_LENGTH);
        Specification<string> isNull = new IsNullSpecification<string>();

        Specification<string> spec = length && !isNull;

        return spec.IsSatisfiedBy(s);
    }
}
再想一想,也许你可以按照

class Parser
{
    static class RedBankSpecification : ISpecification<XElement>
    {
        public override bool IsSatisfiedBy(XElement element)
        {
            return element.Value.equals("RED");
        }
    }

    public void Parse(XDocument doc)
    {
        var rspec = new RedBankSpecification();

        foreach(XElement e in doc)
        {
            if (r.IsSatisfiedBy(e))
            {
                IRedBank bank = new RedBank(e);
                bankFacade.Send(bank);
            }
        }

        //...
    }
}
类解析器
{
静态类redbank规范:ISpecification
{
公共覆盖布尔满足(XElement元素)
{
返回元素.Value.equals(“红色”);
}
}
公共作废解析(XDocument doc)
{
var rspec=新的RedBankSpecification();
foreach(文档中的元素e)
{
如果(r.Issatifiedby(e))
{
IRedBank bank=新的RedBank(e);
bankFacade.Send(银行);
}
}
//...
}
}

然而,你可能并不真的需要这种模式,你也不要试图把问题强加给它

你的英语还不错,你只需要学会如何更好地提问。这里有一些示例代码,如果你能解释一下你对此不理解的地方,也许会更好(不是100%确定)?我确实读过维基百科,但它太多了,很难理解。我更喜欢符合我要求的示例代码。如果您不介意为我提供示例代码:)这是一个非常好的代码示例(不是您的特定领域,但非常具有说明性):谢谢您的示例代码。这给了我基本的想法。我要试试看。祝我好运。再次感谢……你为什么要感谢别人而不把答案标记为已接受?您是否需要更多信息或答案没有帮助?
class Bank : IBank
{
    private ISpecification<IBank> spec;
    private LedgerCode code;

    public Bank(ISepcification<IBank> spec)
    {
        this.code = code;
        this.spec = spec;
    }

    public LedgerCode LedgerCode { get; set; }

    public bool IsValid 
    { 
        get
        {
            return spec.IsSatisfiedBy(this);
        }
    } 
}
class Main
{
    public static void Main()
    {
        var spec = new LedgerCodeSpec(LedgerCodes.SUB)
        var blueBank = new Bank(spec);

        Console.WriteLine(blueBank.IsValid); // false

        blueBank.LedgerCode = LedgerCodes.RCC | LedgerCodes.SUB;

        Console.WriteLine(blueBank.IsValid); // false

        blueBank.LedgerCode = LedgerCodes.SUB;

        Console.WriteLine(blueBank.IsValid); // true
    }
}
class MessageSpecification : Specification<string>
{
    public const int MIN_LENGTH = 5;
    public const int MAX_LENGTH = 60;

    public override bool IsSatisfiedBy(string s)
    {
        Specification<string> length = new LengthSpecification(MIN_LENGTH, MAX_LENGTH);
        Specification<string> isNull = new IsNullSpecification<string>();

        Specification<string> spec = length && !isNull;

        return spec.IsSatisfiedBy(s);
    }
}
class BankFacade
{
    public Send(IBlueBank bank)
    {
        // validate with specification
        // do stuff with IBlueBank
    }

    public Send(IRedBank bank)
    {
        // validate with specification
        // do stuff with IRedBank
    }

    //...
}
class Parser
{
    static class RedBankSpecification : ISpecification<XElement>
    {
        public override bool IsSatisfiedBy(XElement element)
        {
            return element.Value.equals("RED");
        }
    }

    public void Parse(XDocument doc)
    {
        var rspec = new RedBankSpecification();

        foreach(XElement e in doc)
        {
            if (r.IsSatisfiedBy(e))
            {
                IRedBank bank = new RedBank(e);
                bankFacade.Send(bank);
            }
        }

        //...
    }
}