扩展类的依赖注入?

时间:2016-03-08 10:04:44

标签: c# .net 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);
    }
}

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

4 个答案:

答案 0 :(得分:8)

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

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 :(得分:4)

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

答案 2 :(得分:3)

你为什么这样做?

这会增加你的应用程序与屋顶的耦合,并且你的队友可能会非常混淆使用扩展方法(他们必须记住每次使用该方法时注入存储库)。 / p>

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

答案 3 :(得分:-1)

您可以轻松解决依赖项注入,因为这只是一个静态类。

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

现在在代码中的某处

BusinessObjectExtensions.Repository = ...

您决定在代码中解析存储库的最佳时机。您可以在定义DI后执行此操作,但是必须确保在首次使用扩展程序之前完成该操作。