扩展 类 的依赖注入?

Dependency injection for extension classes?

我使用 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);
    }
}

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

您实际上应该尽量避免使用扩展方法,除非它们仅适用于内部数据(class 本身的属性)或方法中提供的简单数据类型。您不应该在扩展方法中与其他依赖项对话。如果你遵循这个规则,你根本不需要在你的 IoC 中注入 extension-classes。

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

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

你为什么要这么做?

这会增加应用程序与屋顶的耦合度,并且可能会让您的队友在使用扩展方法时感到非常困惑(他们必须记住每次使用该方法时都要注入存储库)。

相反,创建一个单独的 class 并使用构造函数注入来注入 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
        });
    }
}