Tag: dependency injection

我可以使用类型工厂设备返回基于(枚举)参数的实现吗?

不确定这是否可行。 我需要根据枚举值返回正确的服务实现。 所以手工编码的实现看起来像: public enum MyEnum { One, Two } public class MyFactory { public ITypeIWantToCreate Create(MyEnum type) { switch (type) { case MyEnum.One return new TypeIWantToCreate1(); break; case MyEnum.Two return new TypeIWantToCreate2(); break; default: return null; } } } 返回的实现具有额外的依赖关系,需要通过容器注入,因此手动工厂将无法工作。 这是可能的,如果是这样,注册会是什么样的?

如何使用WebAPI,WCF,SignalR和后台任务在MVC Web应用程序中配置简单的注入器容器和lifestylse

简单的注入器文档提供了有关如何为WebRequest,Web API,WCF设置容器的很好示例……但这些示例一次特定于一种技术/生活方式。 我们的Web应用程序大部分使用它们! 我不清楚如何配置容器以适应多种生活方式。 假设我有一个带有Web API的MVC项目。 我有以下对象: MyDbContext:我的实体代码第一个db上下文 由MyDataProvider实现的IMyDataProvider:包含查询逻辑并使用MyDbContext MyController:使用IMyDataProvider的MVC控制器 MyApiController:使用IMyDataProvider的WebApi控制器 我应该为每种生活方式创建和配置一个容器吗? 当我使用RegisterPerWebRequest注册所有内容时, RegisterPerWebRequest适用于两种类型的控制器。 这样安全吗? 或者在Web API控制器中使用async / await时会遇到麻烦吗? 当我同时注入相同实例的MVC和Web API控制器时,最佳配置是什么? 我应该使用混合生活方式吗? 现在让事情变得复杂……我们的应用程序也使用后台任务和SignalR。 这些都有时会发生在WebRequest之外,并且需要访问如上所述的相同对象。 最好的解决方案是使用Lifetime范围? 我是否需要为这种生活方式创造一个新的容器? 或者我可以重用/重新配置我的MVC / Web API容器吗? 有三重生活方式吗?

dependency injection容器? 它有什么作用?

我一直在阅读DI,这似乎是一个简单的概念。 我没有得到的是容器。 让我们说一下,我想创建自己的容器。 像“detect”这样的动词被使用了,我不知道容器如何“检测”创建了一个新的依赖对象并且知道注入它的依赖项。 对我而言,容器似乎是一个美化的工厂。 任何人都可以解释一个容器是如何实际实现的,或者可能是指向一个资源? 谢谢!

dependency injection和开发生产力

抽象 在过去的几个月里,我一直在编写一个轻量级,基于C#的游戏引擎,它具有API抽象和实体/组件/脚本系统。 它的整体想法是通过提供类似于Unity引擎的架构来简化XNA,SlimDX等游戏开发过程。 设计挑战 正如大多数游戏开发者所知,在整个代码中需要访问许多不同的服务 。 许多开发人员使用全局静态实例,例如渲染管理器(或composer php),场景,图形设备(DX),记录器,输入状态,视口,窗口等。 全局静态实例/单例有一些替代方法。 一种是通过构造函数或构造函数/属性dependency injection(DI)为每个类提供它需要访问的类的实例,另一种是使用全局服务定位器,如StructureMap的ObjectFactory,其中服务定位器通常配置为一个IoC容器。 dependency injection 出于多种原因,我选择了DI方式。 最明显的一个是可测试性,通过对接口进行编程并具有通过构造函数提供给它们的每个类的所有依赖关系,这些类很容易测试,因为测试容器可以实例化所需的服务或它们的模拟,并输入到每个class级都要进行测试。 不管你信不信,做DI / IoC的另一个原因是提高代码的可读性。 没有更多的初始化过程实例化所有不同的服务,并通过引用所需服务手动实例化类。 配置内核(NInject)/注册表(StructureMap)可以方便地为引擎/游戏提供单点配置,其中选择和配置服务实现。 我的问题 我常常觉得我正在为接口创建接口 我的工作效率急剧下降,因为我所做的只是担心如何以DI方式做事,而不是快速简单的全局静态方式。 在某些情况下,例如在运行时实例化新实体时,需要访问IoC容器/内核来创建实例。 这会产生对IoC容器本身的依赖(SM中的ObjectFactory,Ninject中的内核实例) ,这实际上与首先使用它的原因背道而驰 。 怎么解决这个问题? 我想到了抽象工厂,但这进一步使代码复杂化。 根据服务要求,某些类的构造函数可能变得非常大,这将使该类在其他上下文中完全无用,如果不使用IoC。 基本上做DI / IoC会大大降低我的工作效率,在某些情况下会进一步使代码和架构复杂化。 因此,我不确定这是一条我应该遵循的道路,还是只是放弃并以老式的方式做事。 我不是在寻找一个单一的答案,说明我应该或不应该做什么,而是讨论从长远来看使用DI是否值得,而不是使用全局静态/单一方式,可能的优点和缺点我忽略了处理DI时,上面列出的问题的可能解决方案。

具有相同接口的多个实现的Autofac

我正在使用Autofac,并希望有多个接口实现。 如何配置Autofac以便根据当前类型解析依赖关系? 更具体地说,我有一个接口和多个应该链接在一起的实现。 让我解释一下(虚拟课程): public interface IMessageHandler { void Handle(Message message); } public class LoggingMessageHandler : IMessageHandler { private IMessageHandler _messageHandler; public LoggingMessageHandler(IMessageHandler messageHandler) { _messageHandler = messageHandler; } public void Handle(Message message) { // log something _messageHandler.Handle(message); } } public class DoSomethingMessageHandler : IMessageHandler { private IMessageHandler _messageHandler; public DoSomethingMessageHandler (IMessageHandler messageHandler) { _messageHandler […]

ASP.NET Web API操作方法参数的dependency injection

我正在使用C#中的ASP.NET Web API项目来获取移动应用程序的JSON接口。 我的想法是为所有请求创建接口,然后仅在Web API代码中使用这些接口。 我最终得到了这样的东西: public interface IApiObject {} public interface IApiResponse : IApiObject where T : IApiObject {} public interface IApiRegistrationRequest : IApiObject {} 我的控制器看起来像这样: public class MyApiController : ApiController { public IApiResponse Register(IApiRegistrationRequest request) { // do some stuff } } 我的Web API项目还包含这些接口的实现。 我假设Web API项目使用像MVC项目那样的模型绑定,因此我创建了一个inheritance感知的ModelBinderProvider,用于为所有IApiObjects提供一个绑定器,并使用Unity容器为其实现的接口解析自定义模型绑定器。 但是,经过一些调查,我发现了Web API 如何进行参数绑定,并发现Web API使用格式化程序而不是复杂类型的模型绑定程序。 链接的博客文章建议在我的操作参数上使用ModelBinderAttribute,但该属性仅接受类型作为参数。 但是,我的自定义模型绑定器不包含空构造函数(它需要一个统一容器),所以我需要传递它的一个实例。 我能想到的另一种方法是使用dependency […]

使用非接口的构造函数参数的dependency injection

我仍然是DI的新手,而我正在努力理解我是否以错误的方式思考问题。 当我想表示一个依赖于IRandomProvider的Die对象时,我正在处理一个玩具问题。 那个界面很简单: public interface IRandomProvider { int GetRandom(int lower, int upper); } 我想要一个看起来像这样的Die构造函数: Die(int numSides, IRandomProvider provider) 我正在尝试使用具有如下方法的静态DIFactory: public static T Resolve() { if (kernel == null) { CreateKernel(); } return kernel.Get(); } CreateKernel只是绑定到IRandomProvider的特定实现。 我希望能够通过以下方式调用此方法: DIFactory.Resolve(20); 如果没有制作特殊版本的“Resolve”,我就无法完成这项工作,这可以让我处理ConstructorArgs。 这似乎使事情变得过于复杂,并且需要我为其他每个实例修改DIFactory,以及绑定到构造函数参数的特定名称。 如果我重构Die类不使用int构造函数,一切正常。 但现在有人必须记住初始化numSides参数,这似乎是一个坏主意,因为它是该类的要求。 我怀疑这对DI来说是一个糟糕的心理模型。 任何人都可以开导我吗?

ASP.NET Core中的IServiceProvider

我开始学习ASP.NET 5(vNext)中的更改,但无法找到如何获取IServiceProvider,例如在“Model”的方法中 public class Entity { public void DoSomething() { var dbContext = ServiceContainer.GetService(); //Where is ServiceContainer or something like that ? } } 我知道,我们在启动时配置服务,但所有服务集合停留在哪里或IServiceProvider?

配置Unity以解析采用装饰依赖项的类型,该依赖项的参数随注入的类型而变化

这是一个相当简单的装饰器模式场景,其复杂性在于,装饰类型具有一个构造函数参数,该参数取决于它被注入的类型。 我有这样的界面: interface IThing { void Do(); } 这样的实现: class RealThing : IThing { public RealThing(string configuration) { … implementation … } public void Do() { … implementation … } } 像这样的装饰者: class DecoratingThing : IThing { IThing _innerThing; public DecoratingThing(IThing thing) { _innerThing = thing; } public void Do() { _innerThing.Do(); } } 最后,我有一些需要IThing类型,称为Depender1 […]

如何在Autofac中注册许多开放式通用

我是Autofac的新手 (不是DI )。 情况如下: 我有这些接口: public interface IQuery : IQuery { } public interface IQueryHandler where TQuery : IQuery { TResult Handle(TQuery query); } 在我的解决方案中有很多实现: class GetPersonQuery : IQuery { } class GetPersonQueryHandler : IQueryHandler { } class GetArticleQuery : IQuery { } class GetArticleQueryHandler : IQueryHandler { } class GetSomethingQuery : IQuery<IEnumerable> { } […]