2016-03-04 208 views
0

我知道標題有點模糊,但它是我能想到的最好的。具體實現的接口擴展方法

我有這個屬性

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

你就不能傳遞一個說法? –

+0

傳遞一個參數?你是什​​麼意思?就像在我的每個擴展方法中有一個巨大的switch語句來確定要使用哪個實現? –

回答

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)

+0

你能舉一個更具體的例子嗎? –

+0

一秒鐘,努力想出一個更好的。 – kemiller2002

0

這可能是顯而易見的,但只要你可以存儲cliencode(讓我們在web.config中的),那麼你可以添加一個如果聲明。 由於靜態功能並不擅長解耦,另一種解決方案是使用工廠方法,它將根據客戶提供確切的功能。

factroy下面的例子:

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(); 
     } 
    } 

} 
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) 
+0

我認爲這是最漂亮的解決方案。 – t3chb0t