具体实现的接口扩展方法
本文关键字:扩展 方法 接口 实现 | 更新日期: 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
它的不同实现?
如何接口这样的扩展方法,以便可以根据客户端是谁注入它的不同实现?
不能有接口识别的扩展方法,因为扩展方法实际上是静态的,并且与类相关联。
如果要使它能够注入内容,请使用适当的参数传入Func
或Action
。
例如
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();
}
}
}