2012-03-16 3 views
1

У меня есть few extensions methods Я использую мои веб-формы asp.net для управления форматированием строк сетки.Есть ли способ инъекции/замены расширений?

В основном, они действуют как своего рода «сервис» в моем коде позади классов:

protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     var row = e.Row; 
     if (row.RowType == DataControlRowType.DataRow) 
     { 
      decimal amount = Decimal.Parse(row.GetCellText("Spend")); 
      string currency = row.GetCellText("Currency"); 
      row.SetCellText("Spend", amount.ToCurrency(currency)); 
      row.SetCellText("Rate", amount.ToCurrency(currency)); 
      row.ChangeCellText("Leads", c => c.ToNumber()); 
     } 
    } 

В отличие от экземпляра класса, они не имеют интерфейс, который будет использоваться с DI контейнер.

Есть ли способ получить функциональность заменяемых расширений?

ответ

3

Не во время выполнения, нет - в конце концов, они просто связаны как вызовы статического метода.

Если вы хотите , чтобы иметь возможность поменять их местами, вы можете рассмотреть положить их в интерфейсах вместо ...

Если вы счастливы, чтобы обменять их на компиляции - время, просто измените свои директивы использования.

2

Статический класс - это сквозная проблема. Вы можете сделать DI со статическим классом, если вы извлечете его реализацию в нестатический класс. Затем вы можете назначить конкретную реализацию своему статическому классу.

Ну, мой C# лучше, то мой английский ...

//abstraction 
interface IStringExtensions 
{ 
    bool IsNullOrWhiteSpace(string input); 
    bool IsNullOrEmpty(string input); 
} 

//implementation 
class StringExtensionsImplementation : IStringExtensions 
{ 
    public bool IsNullOrWhiteSpace(string input) 
    { 
     return String.IsNullOrWhiteSpace(input); 
    } 

    public bool IsNullOrEmpty(string input) 
    { 
     return String.IsNullOrEmpty(input); 
    } 
} 

//extension class 
static class StringExtensions 
{ 
    //default implementation 
    private static IStringExtensions _implementation = new StringExtensionsImplementation(); 

    //implementation injectable! 
    public static void SetImplementation(IStringExtensions implementation) 
    { 
     if (implementation == null) throw new ArgumentNullException("implementation"); 

     _implementation = implementation; 
    } 

    //extension methods 
    public static bool IsNullOrWhiteSpace(this string input) 
    { 
     return _implementation.IsNullOrWhiteSpace(input); 
    } 

    public static bool IsNullOrEmpty(this string input) 
    { 
     return _implementation.IsNullOrEmpty(input); 
    } 
} 
+0

+1 этот ребенок напоминает мне так называемый [шаблон поставщика] (http://msdn.microsoft.com/en -us/библиотека/ms972319.aspx) –

Смежные вопросы