扩展类的依赖注入?

Leo*_*ard 10 .net c# ioc-container

我使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来管理扩展类的依赖注入?

mnw*_*mit 11

静态类不可能通过构造函数注入实现默认的依赖注入方式.可以像下面那样使用参数注入,但这不是一种非常干净的方式.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案.唯一的方法是方法注入. (3认同)
  • 如何调用这个扩展? (3认同)

and*_*ico 6

实际上,您应该尽量避免使用扩展方法,除非它们仅对内部数据(类本身的属性)或方法中提供的简单数据类型起作用。您不应该在扩展方法中谈论其他依赖项。如果遵循此规则,则根本不需要在IoC中注入扩展类。

  • @Mariusz你最好传递这个值。您可以选择将其包装到一个私有方法中,并在其中调用它;) (2认同)

ReP*_*rre 5

为什么要这么做?

这将您的应用程序中的耦合提高到屋顶,并且对于您的队友使用扩展方法可能会非常困惑(他们必须记住每次使用该方法时注入存储库)。

相反,创建一个单独的类并使用构造函数注入来注入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
        });
    }
}
Run Code Online (Sandbox Code Playgroud)