2016-03-08 91 views
5

我使用Microsoft Unity作为我的IoC容器。我有一些扩展类的它增加了有用的方法来我的业务对象 这是哪门子的代码,我今天使用:扩展类的依赖注入?

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

实际上,您应该尽量避免使用扩展方法,除非它们只处理内部数据(类本身的属性)或方法中提供的简单数据类型。您不应该在扩展方法中与其他依赖关系进行交谈。如果遵循此规则,则根本不需要向IoC注入扩展类。

+1

这是一个好点。也许我应该创建一个管理类,而不是... – Leonard

4

构造函数注入的事实上的依赖注入的默认方式不可能用于静态类。可以像下面那样使用参数注入,但这不是一个很干净的方法。

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