Questions tagged «dependency-injection»

依赖注入是一种设计模式,其中通过构造函数,方法或字段(属性)设置组件的依赖关系(对象的实例,属性)。它是更一般的依赖项反转的一种特殊形式。

4
渐进式依赖注入方法
我正在使用依赖注入使我的课程可单元测试。但是其中一些类有很多客户端,而且我还没有准备好重构所有这些类以开始传递依赖项。所以我正在努力逐步做到;暂时保留默认依赖关系,但允许对其进行覆盖以进行测试。 我正在考虑的一种方法是将所有“新”调用移入它们自己的方法,例如: public MyObject createMyObject(args) { return new MyObject(args); } 然后,在我的单元测试中,我可以继承该类的子类,并覆盖create函数,以便由它们创建伪造的对象。 这是一个好方法吗?有什么缺点吗? 更一般而言,只要您可以替换它们以进行测试,就可以使用硬编码的依赖项吗?我知道首选方法是在构造函数中明确要求它们,而我希望最终到达那里。但是我想知道这是否是一个好的第一步。 我刚想到的一个缺点是:如果您有需要测试的真实子类,则无法重用为父类编写的测试子类。您必须为每个真实的子类创建一个测试子类,并且它必须覆盖相同的create函数。

1
编程中的“解析”是什么意思?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我在很多地方Resolve都使用过这个词,例如在“依赖注入”(解析接口的实现),“包管理器”(例如:解析包的依赖关系),“ Web”(例如:解析主机名)中。 那么,是什么使代码的逻辑,特别是使一个人选择这个词Resolve在简单的Convert或者Transform甚至是Get?

5
如何使用依赖注入并避免时间耦合?
假设我有Service通过构造函数接收依赖项的,但还需要使用自定义数据(上下文)进行初始化,然后才能使用它: public interface IService { void Initialize(Context context); void DoSomething(); void DoOtherThing(); } public class Service : IService { private readonly object dependency1; private readonly object dependency2; private readonly object dependency3; public Service( object dependency1, object dependency2, object dependency3) { this.dependency1 = dependency1 ?? throw new ArgumentNullException(nameof(dependency1)); this.dependency2 = dependency2 …

4
对数据对象使用依赖注入?
我只是在学习有关依赖项注入的知识,并且陷入了困境。依赖注入建议通过构造函数发送依赖类,但是我想知道对于数据对象是否需要这样做。由于单元可测试性是DI的主要优点之一,因此仅存储数据而不对任何过程进行数据测试的数据对象都会使DI成为不必要的复杂性层,或者它甚至仍然有助于显示依赖性与数据对象? Class DO{ DO(){ DataObject2List = new List<DO2>(); } public string Field1; public string Field2; public List<DO2> DataObject2List; } Class DO2{ public DateTime Date; public double Value; }

1
使用Python的方法解析顺序进行依赖注入-这样不好吗?
我观看了Raymond Hettinger在Pycon上发表的“超级被认为是超级”的演讲,并了解了一些Python的MRO(方法解析顺序),该方法以确定性方式线性化了“父”类。像下面的代码一样,我们可以利用它来发挥优势,进行依赖注入。因此,自然而然地,我现在想使用super所有功能! 在下面的示例中,User该类通过从LoggingService和继承来声明其依赖项UserService。这不是特别特殊。有趣的是,我们可以使用“方法解析顺序”来模拟单元测试期间的依赖关系。下面的代码创建一个MockUserService从继承UserService并提供我们要模拟的方法的实现。在下面的示例中,我们提供的实现validate_credentials。为了MockUserService处理任何呼叫,validate_credentials我们需要先将其UserService放置在MRO中。这通过创建一个包装类各地进行User所谓的MockUser和有它继承User和MockUserService。 现在,当我们执行MockUser.authenticate该操作时,它依次调用方法解析顺序中的super().validate_credentials() MockUserServicebefore UserService,因为它提供了validate_credentials该实现的具体实现。是的-我们已经UserService在单元测试中成功模拟了。考虑到这样UserService做可能会导致一些昂贵的网络或数据库调用-我们刚刚删除了此延迟因素。也没有UserService接触实时/生产数据的风险。 class LoggingService(object): """ Just a contrived logging class for demonstration purposes """ def log_error(self, error): pass class UserService(object): """ Provide a method to authenticate the user by performing some expensive DB or network operation. """ def validate_credentials(self, username, password): print('> UserService::validate_credentials') return username == …

4
如何将依赖注入与Factory模式结合使用
考虑一个负责解析任何给定类型文件的模块。我已经在这里进行了解释,我正在考虑使用策略模式来解决此问题。在继续此问题之前,请参阅链接的帖子。 考虑需要product.xml文件内容的类B。此类将需要实例化Parser接口的适当具体实现程序以解析XML文件。我可以将适当的具体实现者的实例委派给Factory,以使B类“拥有” Factory。但是,类B随后将“依赖”于工厂以实例化具体的实现者。这意味着将需要将类B中的构造函数或setter方法传递给Factory。 因此,需要解析文件的Factory和B类将紧密地结合在一起。我了解到目前为止,我所解释的内容可能完全错误。我想知道是否可以在要注入的依赖项是Factory的情况下使用依赖项注入,以及实现此目标的正确方法是什么,以便在单元测试中利用诸如模拟Factory的优势。

5
我们可以使用策略模式和依赖注入完全取代继承吗?
例如: var duckBehaviors = new Duckbehavior(); duckBehaviors.quackBehavior = new Quack(); duckBehaviors.flyBehavior = new FlyWithWings(); Duck mallardDuck = new Duck(DuckTypes.MallardDuck, duckBehaviors) 由于Duck类包含所有行为(抽象),因此似乎不需要创建新类MallardDuck(扩展了Duck)。 参考:Head First设计模式,第1章。

3
依赖注入:我应该创建一个Car类来容纳其所有零件吗?
我的C ++应用程序中有很多赛车都包含在RaceTrack中。 每辆汽车由数百个零件组成。每个部分都依赖于另外一两个部分。 我已经在DI和Mark Seemann的书上阅读了很多SO问题,并且看起来我不应该为了容纳汽车零件而定义Car类,因为所有汽车零件都将相互依赖,而零件的本质就是汽车。我对吗? 因此,当我将所有赛车放入RaceTrack时,将没有汽车实体,而是很多汽车零件,这取决于彼此在赛道上的比赛??我对吗? 编辑: 很长时间以来,我都在编写汽车类课程,因为对于我来说,如果我编写汽车逻辑学,很显然我需要汽车类。但是使用DI并不是很明显。还是想知道,如果我没有定义角色,那么不创建Car类是DI的惯用做法吗? 我的意思是,可以在没有用于整体代表汽车的实例的情况下,为驾驶人员配备SteeringWheel,为维修人员提供BoltsAndNuts车轮以及其他各种有趣的接口吗?

1
Guice中@ImplementedBy批注背后的动机是什么?
我最近阅读了有关Google Guice中@ImplementedBy可用的注释的信息。它允许程序员指定接口与其实现之间的绑定,以供将来在依赖关系注入中使用。这是即时绑定的示例。 我已经习惯于使用以下语法在模块中定义显式绑定: bind(SomeInterface.class).to(SomeInterfaceImplementation.class); 根据文档,这等效于@ImplementedBy注释的以下用法: @ImplementedBy(SomeInterfaceImplementation.class) public interface SomeInterface { //method declarations } 我在这里看到的唯一好处是代码短了一点。同时,这种方法也有一个缺点,由相同的文档正确指出: @ImplementedBy小心使用;它从接口到其实现添加了编译时依赖性。 在许多情况下,这种依赖关系可能不是问题,但我个人认为这是代码的味道。 什么用例使@ImplementedBy注释值得使用? 一种可能的方法似乎是在库或框架的代码中使用它。如文档中所述,注释可以提供默认绑定,很容易被显式绑定覆盖。 如果一个类型同时在一个bind()语句(作为第一个参数)中并且具有@ImplementedBy注释,bind()则使用该语句。批注建议可使用绑定覆盖的默认实现。 这样,作为库的开发人员,我可以为用户提供现成的绑定,可以在客户端代码中的某个位置进行自定义。 这是注释存在的唯一原因吗?还是我想念的东西?我可以通过在只使用某些业务逻辑的应用程序而不是要扩展的库/框架的代码中使用它来获得任何收益吗?

1
多个Zend应用程序代码组织
在过去的一年中,我一直在研究一系列基于Zend框架的应用程序,并集中于一个复杂的业务逻辑,即所有应用程序即使不使用全部也必须具有访问权限(比每个应用程序具有多个库文件夹更容易)应用程序,因为它们都通过一个公共中心链接在一起)。 在不深入讨论项目具体目的的情况下,我正在寻找一些有关如何“分组”我的代码的输入(因为我正在单独处理项目)。我试图将其拆分为尽可能消除依赖项的方式。 我试图在逻辑上尽可能地保持分离,因此在12个月的时间内,其他任何人都可以毫无疑问地扩展我的作品。 示例结构: applicationStorage\ (contains all applications and associated data) applicationStorage\Applications\ (contains the applications themselves) applicationStorage\Applications\external\ (application grouping folder) (contains all external customer access applications) applicationStorage\Applications\external\site\ (main external customer access application) applicationStorage\Applications\external\site\Modules\ applicationStorage\Applications\external\site\Config\ applicationStorage\Applications\external\site\Layouts\ applicationStorage\Applications\external\site\ZendExtended\ (contains extended Zend classes specific to this application example: ZendExtended_Controller_Action extends zend_controller_Action ) applicationStorage\Applications\external\mobile\ …

4
如何将依赖项注入集成到语言中?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我一直在思考如何将依赖项注入更好地直接集成到类似C#的语言中。我想出一个潜在的解决方案,希望听听您的意见。我没有使用很多依赖注入框架,所以可能有些东西我忽略了 无论如何,该想法是能够使用关键字将属性声明为“可注入”。当实例化一个对象,并且未通过构造函数或对象初始化程序初始化该属性时,它将从某些全局服务中请求该属性类型的实例。 同样,您可以为该服务注册不同类型的处理程序,以便可以实例化注入的属性类型。 使用这种IMO架构的好处是它相当灵活且易于使用。不利之处在于,每次您启动带有注入的类时,对单身人士进行标注都可能会有一些开销。 再说一次,对于在高性能解决方案中经常实例化的类来说,这只是一个问题,所以这不是什么大问题。在这些情况下,也许您可​​以使用某种工厂。 思想,问题,问题,更好的主意? 码 public class SomeClass { public SomeClass() { //implicit behavior if Animal is not set in constructor or initializer this.Animal = GlobalInjector.Get(this,typeof(Mammal)) } public injectable Mammal Animal { get; set; } } GlobalInjector.Register(typeof(Mammal), () => return new Mammal(someParameter));

3
关于将DI / IoC容器集成到现有应用程序中的建议
我现在面临着将控制反转(IoC)容器集成到现有应用程序中的问题,并且我正在寻找一些建议,以最容易实现的最终目标是减少耦合,从而提高可测试性。尽管我通常不会将大多数类归类为上帝对象,但每个类都有太多的职责,并且由于静态,单例和缺乏接口而隐藏了依赖性。 这里有一些背景需要解决的挑战: 很少使用依赖注入 静态方法比比皆是-无论是工厂方法还是辅助方法 单身人士相当普遍 接口在使用时不太细 对象经常通过基类引入不需要的依赖 我们的意图是,下次我们需要在特定区域中进行更改时,我们将尝试弄清实际上存在的但隐藏在诸如单例和静态变量之类的全局变量之后的依赖项。 我想这会使IoC容器在引入依赖项注入之后成为第二位,但是我希望可以遵循或考虑到一系列实践和建议,以帮助我们打破这些依赖关系。

2
要存储库还是不存储库
当我第一次了解域驱动设计时,我还被介绍到了存储库和工作单元模式,这些存储模式和工作单元曾经看起来像是那些酷炫的孩子向数据库发送SQL查询(例如穴居人)的最佳选择。我对这个话题的了解越深,我越了解到它们似乎不再是必需的了,因为EF和NHibernate之类的ORM将工作单元和存储库都实现到一个称为会话或上下文的API中。 现在我不确定该怎么办。是否存储库。我真的很理解这样的论点,即这样的泄漏抽象只会使事情复杂化,而绝对没有增加任何可以简化数据访问的内容,但是,将我的应用程序的各个方面都耦合到例如Entity Framework的感觉并不正确。通常,我遵循一些简单的准则: 域层是系统的核心,包含实体,服务,存储库... 基础结构层提供基础结构领域的域接口的实现,例如文件,数据库,协议。 应用程序层承载一个组合根,该根将所有事物连接起来并进行编排。 我的解决方案通常如下所示: Domain.Module1 Domain.Module2 IModule2Repo IModule2Service Module2 Infrastructure.Persistence Repositories EntityFrameworkRepositoryBase MyApp Boostrapper -> inject EntityFrameworkRepositoryBase into IRepository etc. 我使用a保持域层整洁,IRepository<'T>这也是一个域问题,不依赖于任何其他告诉我如何访问数据的内容。当我现在要实现IModule2Service需要数据访问的具体实现时,我将不得不注入DbContext并将其直接耦合到基础架构层。(要进入Visual Studio项目,由于循环依赖关系,最终可能会非常棘手!) 另外有什么可以到其他托管和作品fucktons?CQRS?如何抽象一个纯粹的基础架构?

4
环境上下文与构造函数注入
我有很多核心类,它们需要数据库的ISessionContext,用于日志的ILogManager和用于与其他服务进行通信的IService。我想对所有核心类使用的此类使用依赖项注入。 我有两个可能的实现。接受所有三个类的IAmbientContext或为所有三个类注入IAmbientContext的核心类。 public interface ISessionContext { ... } public class MySessionContext: ISessionContext { ... } public interface ILogManager { } public class MyLogManager: ILogManager { ... } public interface IService { ... } public class MyService: IService { ... } 第一个解决方案: public class AmbientContext { private ISessionContext sessionContext; private ILogManager …

3
使用依赖项注入时,在一类中可以接受多少次注入
我正在C#中使用Unity进行依赖项注入,但是该问题应该适用于使用依赖项注入的任何语言和框架。 我试图遵循SOLID原理,因此得到了很多抽象。但是现在我想知道是否有一个最佳实践,一个班级应该注入多少次注入? 例如,我有一个包含9个注入的存储库。这对于其他开发人员来说很难理解吗? 注射具有以下职责: IDbContextFactory-为数据库创建上下文。 IMapper-从实体到领域模型的映射。 IClock-摘要DateTime.Now以帮助进行单元测试。 IPerformanceFactory-测量特定方法的执行时间。 ILog-用于记录的Log4net。 ICollectionWrapperFactory-创建集合(扩展IEnumerable)。 IQueryFilterFactory-基于将查询数据库的输入生成查询。 IIdentityHelper-检索登录的用户。 IFaultFactory-创建不同的FaultException(我使用WCF)。 我对如何委派职责并不感到失望,但是我开始对可读性感到担心。 所以,我的问题是: 一个班应该进行多少次注射是否有限制?如果是这样,如何避免呢? 多次注入会限制可读性,还是实际上会提高可读性?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.