具体实现的接口扩展方法

本文关键字:扩展 方法 接口 实现 | 更新日期: 2023-09-27 18:37:23

我知道这个标题有点模糊,但这是我能想到的最好的。

我有这个属性

public string SSN { get; set; }

我还有一个扩展方法:

public static string FormatSSN(this string ssn)
{
    return ssn..... // Format logic
}

所以现在我可以做:

@Model.SSN.FormatSSN()

很酷,但基本的东西。问题是现在我的应用程序的第二个客户端需要FormatSSN()来做不同的事情。

如何interface这样的extension method,以便可以根据客户端是谁inject它的不同实现?

具体实现的接口扩展方法

如何接口这样的扩展方法,以便可以根据客户端是谁注入它的不同实现?

不能有接口识别的扩展方法,因为扩展方法实际上是静态的,并且与类相关联。

如果要使它能够注入内容,请使用适当的参数传入FuncAction

例如

int DoSomethingToSSN(Func<string,string> myFormatSSNAction){
   var myssn = "115454564" 
   return myFormatSSNAction(myssn);
}

public static string FormatSSN(string ssn)
{
    return ssn..... // Format logic
}

然后你会这样称呼它DoSomethingToSSN(FormatSSN)

怎么样

public static string FormatSSN(this string ssn, string clientIdentity)
{
    switch (clientIdentity)
    {
        case "client1Identifier":
            return ssn..... // Format logic for client 1
            break;
        case "client2Identifier":
            return ssn..... // Format logic for client 2
            break;
        default:
            return ssn..... // Default Format logic
            break;
    }
}

@Model.SSN.FormatSSN(@Model.ClientIdentifier)

这可能很明显,但只要你可以存储 cliencode(让我们在 web.config 中),那么你可以添加一个 if 语句。由于静态函数不太容易解耦,另一种解决方案是采用工厂方法,该方法将根据客户提供精确的功能。

下面的事实示例:

namespace ConsoleApplication1
{
    public interface ISsnFormater
    {
        string Format(string input);
    }
    public class ClientOneFormater : ISsnFormater
    {
        public string Format(string input)
        {
            throw new NotImplementedException();
        }
    }
    public class ClientTwoFormater : ISsnFormater
    {
        public string Format(string input)
        {
            throw new NotImplementedException();
        }
    }
    public class FormaterFactory
    {
        public ISsnFormater GetFormaterFor(string customerName)
        {
            switch (customerName)
            {
                case "One":
                    return new ClientOneFormater();
                case "Two":
                    return new ClientTwoFormater();
            }
            throw  new IndexOutOfRangeException();
        }
    }
}