|
|
1
8
第一: 根据需要将简单的依赖项添加到构造函数中。不需要向每个构造函数中添加每种类型,只需添加您需要的类型。需要另一个,只需扩展构造函数。性能不应该是一件大事,因为这些类型中的大多数可能是单例的,所以在第一次调用之后就已经创建了。不要使用静态DI容器来创建其他对象。相反,将DI容器添加到自身,以便它可以将自身解析为依赖项。所以像这样(暂时假设统一)
通过这种方式,您只需添加对IUnitycontainer的依赖,并使用它来创建昂贵或很少需要的对象。其主要优点是,在单元测试时,由于没有静态依赖关系,因此更加容易。 第二: 不需要通过工厂课程。使用上述技术,您可以在需要时使用DI容器本身创建昂贵的对象。 三: 将DI容器和轻单体依赖项添加到主窗体,并根据需要通过DI容器创建其余的依赖项。需要更多的代码,但是正如您所说的,如果您在启动时创建所有东西,那么主窗体的启动成本和内存消耗将非常困难。 |
|
|
2
25
好吧,虽然您可以像其他答案中描述的那样这样做,但我相信对于您的示例,还有更重要的事情需要回答,那就是您可能违反了SRP原则,类具有许多依赖性。 在您的示例中,我将考虑将类分解为两个更为一致、关注点更为集中的类,这样它们的依赖项的数量就会下降。 尼古拉定律
(为了避免冗长的回答,我在 IoC and SRP 博客帖子) |
|
|
3
4
第一: 如果需要,可以将这些对象作为成员而不是构造函数中的成员来注入。这样,您就不必随着使用情况的变化而对构造函数进行更改,也不需要使用静态的。 第二: 把一些建筑工人或工厂交给他们。 第三: 任何类都应该只有它自己需要的依赖项。子类应该注入它们自己特定的依赖关系。 |
|
|
4
4
我有一个类似的案例与“创造和 可以 在我自己的IOC实现中,我添加了对工厂服务的automagic支持。 基本上,不是这样:
你可以这样做:
这有两个优点:
工厂对象很容易制作,解决了很多问题。 这是我的工厂课程:
基本上,当我从ServiceContainerBuilder类构建服务容器时,所有服务注册都会自动地被授予另一个联合服务,为该服务实现IServiceFactory,除非程序员已经在他/她自己身上显式注册了该服务。然后使用上面的服务,其中一个参数指定策略(如果不使用策略,则可以为空)。 这使我能够做到:
当然,更典型的用法是使用CD刻录机对象。在上面的代码中,我将解析服务,而不是当然,但它是一个发生了什么的示例。 因此,使用CD刻录机服务:
在服务内部,您现在可以拥有一个服务,一个工厂服务,它知道如何根据请求解决您的CD刻录机服务。这是有用的,原因如下:
同时有两个:
以下是两个接一个的服务,不是重用同一个服务:
|
|
|
5
2
第一: 您可以通过创建一个容器来保存您的“无趣”依赖项(ilog、icache、IApplicationSettings等),然后使用构造函数注入,然后在构造函数内部,从container.resolve()对服务字段进行水合物化处理。我不确定我会喜欢,但是,嗯,这是可能的。 或者,您可以使用新的ISeviceLogator公共接口( http://blogs.msdn.com/gblock/archive/2008/10/02/iservicelocator-a-step-toward-ioc-container-service-locator-detente.aspx )而不是注入依赖项? 第二: 您可以对可选/按需依赖项使用setter注入?我想我会去注射工厂,从那里按需生产新产品。 |
|
|
6
0
部分回答我的 第一 问题,我刚发现 blog post JeremyMiller展示了如何使用结构图和setter注入来自动填充对象的公共属性。他以ilogger为例:
这意味着任何具有ilogger属性的类,例如:
将在构造时自动设置其记录器属性:
|