Tag: dependency injection

如何使用DI在Class Constructor中获取Microsoft.AspNet.Http.HttpContext实例

我正在MVC 6中构建一个一次性应用程序,并尝试使用不同的依赖架构。 我面临的问题是如何创建特定于应用程序的自定义“ MyAppContext ”对象。 这将需要来自HttpContext一些信息和来自数据库的一些信息,并且将是针对应用程序特定属性的请求范围的存储库。 我想将HttpContext的实例传递给’ MyAppContext ‘的构造函数。 我已经使用DI成功创建了一个带有IDataService接口的’ DataService ‘对象,这IDataService用。 与’MyAppContext’类的不同之处在于它在构造函数中有两个参数–‘ DataService ‘和Microsoft.AspNet.Http.HttpContext 。 这是MyAppContext类: public class MyAppContext : IMyAppContext { public MyAppContext(IDataService dataService, HttpContext httpContext) { //do stuff here with the httpContext } } 在启动代码中,我注册了DataService实例和MyAppContext实例: public void ConfigureServices(IServiceCollection services) { services.AddMvc(); //adds a singleton instance of the DataService using DI services.AddSingleton(); services.AddScoped(); […]

dependency injection:如何通过注射容器?

(这个问题不依赖于特定的IoC框架,因此我的示例中的接口和类型是元类型。只需用适合您喜欢的IoC框架的类型替换它们。) 在我的主要方法中,我通常设置我的容器做这样的事情: static void Main() { IInjector in = new Injector(); in.Register().For(); in.Register<IOtherType().For(); … // Run actual application App app = in.Resolve(); app.Run(); } 我的问题是,你是如何得到注射器的? 我通常只是自己注册了注射器,并注入了自己注射的类型,但我不确定这是否是正确的“模式”。

什么是.NET中的IoC

可能重复: 什么是控制倒置? 我不熟悉控制反转(IoC)。 什么是IoC以及应用程序如何从使用IOC中受益。 如何在.NET中使用C#实现?

当需要多个相同类型的实例时,使用Unity进行DI

我需要帮助。 我使用Unity作为我的容器,我想在构造函数中注入两个相同类型的不同实例。 class Example { Example(IQueue receiveQueue, IQueue sendQueue) {} } ….和IQueue在我的MessageQueue类中实现…. class MessageQueue : IQueue { MessageQueue(string path) {} } 如何将两个不同的MessageQueue实例注入我的Example类? 要使用不同路径创建的每个MessageQueue实例。

找到.NET库的正确组合根

我在这里看到了关于这个论点的各种其他问题,最值得注意的是 dependency injection(DI)“友好”库 Ioc / DI – 为什么我必须在输入应用程序中引用所有层/组件? 和这篇文章 (和其他各种材料)。 但是,我不清楚将组合根放在库(DLL).NET项目中的哪个位置。 该项目不属于本文中提到的任何特定类型。 在桌面,控制台甚至Web应用程序中,这一点都是明确定义的。 我目前的方法是包装容器,注册类型并重新公开Resolve方法: class DefaultBootstrapper : IBootstrapper { public Bootstrapper() { _container = new XXXContainer(); RegisterTypes(_container); } public T Resolve() where T : class { return _container.Resolve(); } // + other _container.Resolve() overloads private readonly XXXContainer _container; } 然后我阻止库消费者创建库的根实例 (例如,定义内部构造函数),从而强制使用单例工厂: class XYZFactory { static […]

模型类(实体)中的dependency injection

我正在使用Entity Framework Code-First构建ASP.NET Core MVC应用程序。 我选择实现一个简单的存储库模式,为我创建的所有模型类提供基本的CRUD操作。 我选择遵循http://docs.asp.net中提供的所有建议,DI就是其中之一。 在.NET 5中,dependency injection非常适用于我们不直接实例化的任何类(例如:控制器,数据存储库,……)。 我们只需通过构造函数注入它们,并在应用程序的Startup类中注册映射: // Some repository class public class MyRepository : IMyRepository { private readonly IMyDependency _myDependency; public MyRepository(IMyDependency myDependency) { _myDependency = myDependency; } } // In startup.cs : services.AddScoped(); services.AddScoped(); 我遇到的问题是,在我的一些模型类中,我想注入一些我声明的依赖项。 但我认为我不能使用构造函数注入模式,因为模型类通常是明确地实现的,因此,我需要为自己提供依赖项,我不能。 所以我的问题是:是否有另一种方式比构造函数注入注入依赖项,以及如何? 我是在考虑属性模式或类似的东西。

让autofac与mvc6 beta5一起使用

我正在尝试使用我正在处理的mvc6应用程序使用autofac。 我发现这篇博客文章似乎有点过时了。 它看起来像使用beta3位 我正在使用这个clr版本 1.0.0-beta5-11911 我的项目有这两个参考 “Autofac”: “4.0.0-alpha2”, “Autofac.Dnx”: “4.0.0-alpha2”, 在文章中讨论了如何修改startup.cs // Create the Autofac container builder. var builder = new Autofac.ContainerBuilder(); // Add any Autofac modules or registrations. builder.RegisterModule(new AutofacModule()); // Populate the services. builder.Populate(services); // Build the container. var container = builder.Build(); return container.Resolve(); 上面的代码抱怨builder.Populate(services); 给我一个错误 “IServiceDescriptor”类型在未引用的程序集中定义。 您必须添加对程序集“Microsoft.Framework.DependencyInjection.IServiceDescriptor,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = […]

Ninject传递构造函数值

使用Ninject,您如何配置内核,以便我可以定义哪些构造函数值传递到对象的实例化? 我在模块中配置了以下内容: Bind() .To() .InSingletonScope() .Named(“LIVE”); Bind() .To() .InSingletonScope() .Named(“LIVE”) .WithConstructorArgument( “service1”, Kernel.Get(“LIVE”)); Service2Impl接受IService1的构造函数参数,但我希望它来自容器。 我也想要命名绑定,因为我的代码将在运行时针对不同的版本。 这似乎有效,但它是实现我想做的正确方法吗? 我是否应该在不使用命名绑定的情况下实现并将不同的配置模块连接到内核中? 编辑 我现在使用ToMethod()方法指定一个委托,以根据特定类型的请求进行调用。 这看起来好一点,因为如果构造函数配置错误,我将得到编译时警告,而不是必须知道我首先传递的参数的名称。 谢谢

ASP.NET Web API跨请求缓存操作筛选器属性

在ASP.NET Web API(4.0.30506)中似乎有一些奇怪的行为,我以前没见过。 我所看到的是,相同的动作filter属性实例在Web API请求上被重用。 如果此属性将依赖项注入其中,则这尤其是一个问题,因为这些依赖项可能特定于Web请求。 我知道属性更好是被动的 ,但我的假设是动作filter属性没有被缓存。 我搜索了描述这个的任何文章,博客文章或微软更改日志及其背后的原因,但我找不到一件事。 这让我想知道我的配置是否有问题导致这种情况发生。 但是,我能够在一个新的,空的Visual Studio 2012 Web API项目中重现这个问题。 我所做的是使用带有“Web API”模板的Visual Studio 2012 ASP.NET MVC 4 Web应用程序项目创建一个新的空项目。 它附带了Web API 4.0.20710.0 NuGet包。 之后我添加了以下属性: [DebuggerDisplay(“{id}”)] public class TestFilterAttribute : System.Web.Http.Filters.ActionFilterAttribute { private static readonly List used = new List(); private static int counter; private readonly int id; public TestFilterAttribute() { this.id […]

用简单的注射器替换Ninject

我已经将Ninject用于我的应用程序。 Ninject非常简单易学,但速度很慢,我尝试使用另一个IoC来比较它是否比Ninject更快。 MVC3和Simple Injector有很多IoC容器看起来对我很好,但是我在使用Simple Injector重新替换Ninject时遇到了很多问题。 特别是使用AutoMapper 。 我尝试将这些行转换为Simple Injector代码。 Bind().To(); foreach (var mapper in MapperRegistry.AllMappers()) { Bind().ToConstant(mapper); } Bind().ToSelf().InSingletonScope() .WithConstructorArgument(“mappers”, ctx => ctx.Kernel.GetAll()); Bind() .ToMethod(ctx => ctx.Kernel.Get()); Bind().ToMethod(ctx => ctx.Kernel.Get()); Bind().To() 你能帮帮我吗? 我已经阅读了文档和Google搜索,但到目前为止还没有解决方案。