我知道标题有点模糊,但这是我能想到的最佳标题。
我有这个属性
public string SSN { get; set; }
我还有一个扩展方法:
public static string FormatSSN(this string ssn)
{
return ssn..... // Format logic
}
现在我可以做到:
@Model.SSN.FormatSSN()
很酷,但基本的东西。问题是现在我的应用程序的第二个客户端需要FormatSSN()
来执行不同的操作。
我如何interface
这样extension method
以便我可以根据客户是谁inject
进行不同的实施?
答案 0 :(得分:1)
如何连接这样的扩展方法,以便根据客户端是谁来注入不同的实现?
您不能拥有接口可识别的扩展方法,因为扩展方法实际上是静态的并且与类相关联。
如果你想这样做就可以注入东西,可以使用适当的参数传递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)
答案 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();
}
}
}