2016-03-08 3 views
5

Я использую Microsoft Unity, как мой контейнер IoC. У меня есть несколько классов расширения, который добавляет полезные методы для моей бизнес-объектов Это своего кода я использую сегодня:Dependency Injection для классов расширения?

public static class BusinessObjectExtensions 
{ 
    public static bool CanDoStuff(this BusinessObject obj) 
    { 
     var repository = BusinessHost.Resolver.Resolve<IRepository>(); 
     var args = new EArgument { Name = obj.Name }; 
     return repository.AMethod(obj.UserName, args); 
    } 
} 

Есть ли лучший способ управлять инъекции зависимостей для классов расширения?

+0

я думаю, он не показывает, имеющий какие-либо требования, чтобы быть 'расширение method' .. так много объектов зависимостей являются их – Moumit

ответ

2

Вы должны действительно попытаться избежать extensionmethods, если они не работают только на внутренних данных (свойств в самом классе), или простых типов данных, предусмотренных в методе. Вы не должны разговаривать с другими зависимостями в ваших методах расширения. Если вы следуете этому правилу, вам не нужно вводить классы расширения с помощью IoC.

+1

Это хороший момент. Возможно, я должен создать класс управления вместо этого ... – Leonard

4

де-факто по умолчанию способ Dependency Injection строителя инъекции не представляется возможным для статических классов. Можно было бы использовать параметр Injection, как показано ниже, однако это не очень чистый способ.

public static class BusinessObjectExtensions 
{ 
    public static bool CanDoStuff(this BusinessObject obj, IRepository repository) 
    { 
     var args = new EArgument { Name = obj.Name }; 
     return repository.AMethod(obj.UserName, args); 
    } 
} 
1

Зачем вам это нужно?

Это повышает сцепление в приложении с крышей и может смущать ваших товарищей по команде использовать метод расширения (им нужно помнить о том, чтобы вводить репозиторий каждый раз, когда используется метод).

Вместо этого создайте отдельный класс и использовать конструктор инъекции впрыскивать IRepository экземпляра:

public class StuffExecuter  
{ 
    private readonly IRepository _repository; 

    public StuffExecuter(IRepository repository) 
    { 
     _repository = repository; 
    } 

    public bool CanExecute(BusinessObject obj) 
    { 
     _repository.Add(obj.UserName, new EArgument 
     { 
      Name = obj.Name 
     }); 
    } 
} 
+0

Так мы делаем это по дизайну, но приведенный выше пример был взят из действительно конкретного, если не полностью изолированного, прецедента, в котором мы верили в удобство подключения функций мы нуждались в нашем бизнес-объекте. Оглядываясь назад, это была не очень хорошая идея, поэтому я переведу ее в другом месте. Спасибо! – Leonard