【发布时间】:2017-10-18 08:57:17
【问题描述】:
我想尽量避免使用服务定位器。 但另一方面,我没有在 startup.cs 文件中注册所有类型。我认为所有这些内部类型都在主startup.cs中引用是不对的
我目前有一个工厂类,其中包含一组构建器类。 每个构建器类负责创建一个特定的对象。 我不想提前创建所有这些构建器类,因为我可能不需要使用它们并且创建它们有点繁重。 我在上面的链接中看到了如何实现此目的的示例。然而,startup.cs 类需要了解所有这些构建器。我认为这不合适,我宁愿让工厂类成为唯一暴露给它们的类。我试图了解是否有某种 func/action 方法可以从 startup.cs 文件注入到我的工厂类中。这个函数/动作将负责创建/注册构建器,然后我可以在类工厂中激活这个函数/动作。我希望这个 func/action 接收构建器的接口/类/可能名称,但使用泛型不起作用。我搜索了很多并没有找到任何解决方案,所以我认为这是不可能的。 似乎我有两个选择: 1.使用服务定位器。这样只有工厂类会知道建设者。但是,如果将来,如果我想更改 DI,我需要“触摸”工厂类(我正在污染工厂类)。希望所有 DI 代码仅位于 startup.cs 类中。 2. 在 startup.cs 中注册构建器,但现在 startup.cs 知道构建器。这有点耦合代码,而不是真正的单一职责角色
如果可以从 startup.cs 中为工厂类注入一个 func/action 来进行注册,但工厂类本身会激活它,那就太好了。 这可能吗?
【问题讨论】:
-
在单个类中注册类型没有错。如果需要,可以将其移动到配置文件中。
-
好吧,我不喜欢配置文件,通常尽量避免使用它们。在 startup.cs 中注册所有类型 - 这似乎不太健康。如果我们想要更改构建器,我们需要“离开”工厂/构建器区域并跳转到 startup.cs 并开始删除/添加注册。我认为这是注册Logger/Configuration/等通用组件的好地方。但不会将我所有的类型都加载到一个地方。
-
你不会每小时都更改旧的依赖项,所以我不明白只去一个文件并更改一行代码的问题是什么。