我想在我们的应用程序中引入DI。
在我们的应用程序中,我们有一些通用的参数传递给整个 应用程序,主要通过构造函数参数。 例如,参数 region 将所有操作限制为地理区域。此参数在运行时从用户输入收集,因此在组合根处不知道。
我应该如何创建始终限于在区域上工作的课程?
我知道我可以使用工厂模式。在这种情况下,我需要将DIC传递到工厂,这是(据我所知)反模式。
答案 0 :(得分:4)
当使用DI时,工厂模式肯定不是反模式,即使你会看到工厂的数量decrease when you apply DI correctly。
在你的情况下,工厂可能不是最好的方法。通常您应该prevent letting the object graph depend on runtime data,并且您应该将该请求特定数据的需求与您的服务组合分开。
在您的情况下,可能很容易使用某种IRegionContext
或IRegionManager
抽象来获取当前请求的区域。这个IRegionContext
本身就是一个服务,但是包含一个方法,可以在构造对象图之后由应用程序调用:
public interface IRegionContext
{
Region CurrentRegion { get; }
}
应用程序类型可以取决于IRegionContext
,并且在Web应用程序的组合根目录中,您可以使用特殊的AspNetRegionContext
实现,该实现允许根据当前请求检索区域。