我使用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 :(得分: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后执行此操作,但是必须确保在首次使用扩展程序之前完成该操作。