具体实现的接口扩展方法

时间:2016-03-04 21:32:51

标签: c# dependency-injection interface extension-methods

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

我有这个属性

public string SSN { get; set; }

我还有一个扩展方法:

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

现在我可以做到:

@Model.SSN.FormatSSN()

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

我如何interface这样extension method以便我可以根据客户是谁inject进行不同的实施?

3 个答案:

答案 0 :(得分:1)

  

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

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

如果你想这样做就可以注入东西,可以使用适当的参数传递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)

答案 1 :(得分:1)

怎么样

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)

答案 2 :(得分:0)

这很明显,但只要你能存储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();
        }
    }

}