Tag: ninject

EF的DbContext的单例范围

所以我目前正在使用一个使用Entity Framework的ASP.NET MVC Web应用程序,我也使用Ninject进行dependency injection。 所以基本上,目前,这是我用Ninject注册我的DbContext和服务的方式。 kernel.Bind().To().InSingletonScope(); kernel.Bind().To().InSingletonScope(); kernel.Bind().To().InSingletonScope(); kernel.Bind().To().InSingletonScope(); 我用InSingletonScope注册它们,这意味着它们只会被创建一次并在应用程序的整个生命周期中使用(至少我是如何理解的)。 控制器: private IAccountService _accountService; public MemberController(IAccountService accountService) { _accountService = accountService; } 但是,我深深感到这个单例范围会导致我的Web应用程序出现问题,特别是对于Entity Framework的上下文,因为它是单例。 我已经面临一个小问题,如果我使用SQL Management Studio手动更新数据库,我的Web应用程序的entity framework中的数据将不会更新,直到我重新启动应用程序(似乎是EF中的一些缓存机制)。 – 但是,如果我删除InSingletonScope ,我将从EF中随机获取错误,说: IEntityChangeTracker的多个实例不能引用实体对象 我理解为什么会发生这种情况,因为AccountService初始化的DbContext可能与RegionService不同。 但我不知道如何解决这个问题。 我对dependency injection的理解仍然非常有限,所以有人可以建议吗? – 编辑:我已经尝试过更换为InRequestScope以进行所有注射,但我仍然InRequestScope IEntityChangeTracker的多个实例不能引用实体对象 尝试从我的应用程序中的另一个服务插入具有相关对象(外键)的新实体时。 这意味着他们仍在使用不同的DbContext,发生了什么?! 最后编辑:好的我发现了问题,这是我的缓存机制缓存了以前的请求,导致所有后续请求的关系问题。

使用Ninject将通用接口绑定到存储库时,获取“MissingMethodException:无法创建接口实例”

按照此处的指南,但不是StructureMap尝试使用Ninject。 IRepository我尝试将一个IRepository注入到action方法的参数中时,它都会抛出“MissingMethodException:无法创建接口实例”错误。 更新:还没有找到bootstrapper.cs,我使用了MVC3 Ninject Nuget包。 public ActionResult Index(IRepository repo) { return View(); } NinjectWebCommon.cs private static void RegisterServices(IKernel kernel) { string Cname = “VeraDB”; IDbContext context = new VeraContext(“VeraDB”); kernel.Bind().To().InRequestScope().WithConstructorArgument(“ConnectionStringName”, Cname); kernel.Bind(typeof(IRepository)).To(typeof(EFRepository)).WithConstructorArgument(“context”,context); } IRepository public interface IRepository where T : class { void DeleteOnSubmit(T entity); IQueryable GetAll(); T GetById(object id); void SaveOrUpdate(T entity); } EFRepository […]

NamedScope和垃圾收集

(这个问题首先在Ninject Google Group中提出,但我现在看到Stackoverflow似乎更活跃了。) 我正在使用NamedScopeExtension将相同的ViewModel注入View和Presenter。 释放View后,内存分析显示Ninject缓存仍保留ViewModel。 如何让Ninject释放ViewModel? 当Form关闭和处置时,所有ViewModel都会被释放,但我正在使用Form中的Factory创建和删除Controls,并希望将ViewModel垃圾收集到(收集Presenter和View)。 有关问题的说明,请参阅以下UnitTest,使用dotMemoryUnit: using System; using FluentAssertions; using JetBrains.dotMemoryUnit; using Microsoft.VisualStudio.TestTools.UnitTesting; using Ninject; using Ninject.Extensions.DependencyCreation; using Ninject.Extensions.NamedScope; namespace UnitTestProject { [TestClass] [DotMemoryUnit(FailIfRunWithoutSupport = false)] public class UnitTest1 { [TestMethod] public void TestMethod() { // Call in sub method so no local variables are left for the memory profiling SubMethod(); // […]

何时在Ninject中取消激活瞬态范围对象?

当Ninject中的对象与InTransientScope()绑定时,该对象不会被放入缓存中,因为它是,呃,是瞬态的,而不是作用于任何东西。 完成对象后,我可以调用kernel.Release(obj) ; 这会传递到Cache,在那里它会检索缓存的项目,并使用缓存的条目调用Pipeline.Deactivate 。 但由于临时对象没有缓存,因此不会发生这种情况。 我无法弄清楚在哪里(或谁)对瞬态对象执行停用。 或者假设瞬态对象只被激活,如果我想要一个可停用的对象,我需要使用其他一些范围?

Ninject 2.0 – 绑定到多次使用相同接口的对象?

考虑以下: public Something(IInterface concreteObjectOne, IInterface concreteObjectTwo) { this.concreteObjectOne = concreteObjectOne; this.concreteObjectTwo = concreteObjectTwo; } 如何设置与Ninject绑定此类绑定? 我试着谷歌搜索这个词,但由于我不知道这叫做什么我不能,也无法在Wiki上找到任何关于此的内容。 编辑 : 我相信这被称为基于约定的绑定,如此处所述。 但是,此文档适用于版本1.0和2.0没有Only方法。 我希望这可以在没有属性的情况下实现 – 使用名称约定或类似的东西。

初始化ninject时,’Sequence不包含任何元素’exception

我有一个Ninject的问题,我以前没见过,也不知道如何修复。 我正在使用MVC NuGet包进行MVC 5。 在我的NinjectWebCommon.cs中,有以下方法: public static void Start() { DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); bootstrapper.Initialize(CreateKernel); } 但是,它在尝试执行最后一行时会失败,抱怨“序列不包含任何元素”。 我以前使用Unity进行DI但已更改为Ninject。 有任何想法吗? 先谢谢你,M

Ninject 2.1 ActivationException:激活字符串时出错

我很困惑为什么我收到“Ninject.ActivationException:错误激活字符串没有匹配的绑定可用,并且类型不可自绑定”在随机绑定中。 如果我保留IMedia的绑定,它将抛出ActivationException,但是如果我使用CallbackProvider它就可以工作。 所有这些类的结构都相同,只有几个不同的属性。 我很困惑为什么ILocationType,IMedia和IFarmDataContext抛出ActivationException而其他人没有。 有任何想法吗? /****************************** * Core Types ******************************/ Bind().ToProvider(new CallbackProvider(delegate { return new FarmDataContext(); })); //Media Bind().To(); //blows up //Bind().ToProvider(new CallbackProvider(delegate { return new Media(); })); Bind().To(); Bind().To(); //Location Bind().To(); Bind().ToProvider(new CallbackProvider(delegate { return new LocationType(); })); Bind().To();

使用新的WCF Web API设置Ninject

所以我一直在玩最新版本的WCF Web API,并决定用它来实现Ninject。 基于我读过的内容,我需要实现IResourceFactory接口,该接口需要以下方法: public object GetInstance(System.Type serviceType, System.ServiceModel.InstanceContext instanceContext, System.Net.Http.HttpRequestMessage request); public void ReleaseInstance(System.ServiceModel.InstanceContext instanceContext, object service); 所以我把鸡抓了下面: public class NinjectResourceFactory : IResourceFactory { private readonly IKernel _kernel; public NinjectResourceFactory() { var modules = new INinjectModule[] { new ServiceDIModule(), //Service Layer Module new RepositoryDIModule(), //Repo Layer Module new DataServiceDIModule() }; _kernel = new StandardKernel(modules); […]

Ninject:注入两个相同类型的不同对象

如果我有一个类,它具有相同类型的双重依赖(需要两个不同的实例),如果实例之间的唯一区别是更深的依赖,那么让Ninject执行DI并保持两个图分开的最佳方法是什么? 示例对象图: foo → ClassA → ClassB bar → ClassA → ClassB C类的构造函数: public class C { public C(ClassB foo, ClassB bar) { … } } 那么我如何确保用foo实例化的ClassB作为ClassB依赖foo ,并且bar … bar ? 仅仅是为了某些背景,我有一些需求变化,所以我需要用复合只写存储库替换只写存储库(IAdd) public class CompositeWriteRepository : IAdd { public CompositeWriteRepository(IAdd foo, IAdd bar, Func descriminator) { … } public Add(T entity) { if (descriminator(entity)) { […]

使用Ninject在我的存储库类中设置DBContext的连接字符串

我有一个使用EF 6的MVC 5应用程序,并使用DI容器Ninject实现具有dependency injection的Repository模式。 dbcontext的连接字符串存储在EF Context正确找到的Web.config文件中。 一切正常。 最近,我要求需要在运行时确定与我的DBContext的连接并连接到不同的数据库(但具有完全相同的结构)。 因此,我需要在实例化存储库之前在运行时从实体连接字符串更改sql connectionstring部分。 我真的很感激帮助。 我不是DI大师; 知道足够的Ninject让我的事情继续下去。 这是我的存储库基础接口: public interface IRepositoryBase where T : class { void Add(T entity, string userGuid = “”); void Delete(T entity); // … removed other method signatures for brevity } 我的存储库基础实现: public abstract class RepositoryBase : IRepositoryBase, IDisposable where T : class where D […]