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)
实际上,您应该尽量避免使用扩展方法,除非它们仅对内部数据(类本身的属性)或方法中提供的简单数据类型起作用。您不应该在扩展方法中谈论其他依赖项。如果遵循此规则,则根本不需要在IoC中注入扩展类。
为什么要这么做?
这将您的应用程序中的耦合提高到屋顶,并且对于您的队友使用扩展方法可能会非常困惑(他们必须记住每次使用该方法时注入存储库)。
相反,创建一个单独的类并使用构造函数注入来注入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)