扩展 类 的依赖注入?
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
});
}
}
我使用 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
});
}
}