Tag: ninject

使用非接口的构造函数参数的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来说是一个糟糕的心理模型。 任何人都可以开导我吗?

当Ninject用作依赖项解析器时,如何在asp.net mvc3 App中处理DbContext(或对象)

对于这个Demo,我创建了一个虚假的Database +存储库,如下所示 假Db +存储库 public interface IDemoRepository { string[] GetUsers(); } public class DemoRepository : IDemoRepository, IDisposable { public string[] GetUsers() { string[] Users = { “Robert”,”Linda”,”Jack”}; return Users; } public void Dispose() { //do nothing throw new Exception(“Disposed is called”); } } 我的控制器看起来如此 public class TestController:Controller { protected IDemoRepository _repository; public BaseController(IDemoRepository repository) { […]

三层asp.net mvc应用程序中的dependency injection

我有一个3层应用程序,层是: Web:表示层(ASP.NET MVC) – >只能看到BLL BLL:业务逻辑层 – >只能看到DAL DAL:数据访问层 因此, Web层对我的DAL层一无所知。 我在DAL有存储库接口和具体类,它们在业务逻辑类的BLL层中使用。 问题是,为了解耦DAL和BLL ,如何设置Ninject以将我的存储库实现注入BLL层? 同样的问题是Web层和BLL层,我在BLL上有接口和实现,我在Web层使用它们,我应该如何为此设置Niject?

使用Ninject注入实现相同接口的不同类

我正在实现构建器设计模式,以构建要在WPF UI上显示的不同类型的图形对象。 我使用Ninject作为我的IOC容器。 但是,我试图找到一个优雅的可扩展解决方案。 我有一个ChartDirector对象,它将IChartBuilder作为依赖项。 我还有实现IChartBuilder TemperatureChartBuilder和ThresholdChartBuilder 。 我想将TemperatureChartBuilder或ThresholdChartBuilder注入ChartDirector具体取决于触发的事件或取决于客户端调用。 我在下面用代码说明了我的问题。 // ChartDirector also depends on this kernel.Bind().To(); // when called in Method X… kernel.Bind().To(); // when called in Method Y… kernel.Bind().To<ThresholdChartBuilder(); // TemperatureChartBuilder is a dependency of ChartDirector, need a way to dynamically // allocate which binding to use. var director = kernel.Get(); // without […]

如何将Entity Framework DbContext注入SharpRepository的ConfigurationBasedRepository

我真的想将SharpRepository与Ninject一起使用,但我不明白如何配置Ninject以在存储库之间共享Entity Framework DbContext。 我正在使用Entity Framework版本5和Ninject版本3。 目前我在源代码中使用Ef5Repository ,但我想用ConfigurationBasedRepository替换它。 但我无法弄清楚如何将EF DbContext传递(或注入)到存储库。 示例(当前状态): using SharpRepository.Repository; public interface IProductRepository : IRepository { } using SharpRepository.Ef5Repository; using System.Data.Entity; // TODO Tightly coupled to Ef5Repository. public class ProductRepository : Ef5Repository, IProductRepository { // TODO The DbContext has to be injected manually. public ProductRepository(DbContext context) : base(context) { } // […] } […]

在Ninject中的所有程序集中加载模块

我的项目中有几个类库,并且都使用Ninject IoC容器。 我希望在找到INinjectModule任何地方INinjectModule加载StandardKernel中的所有模块。 所以我用过: var kernel = new StandardKernel(); kernel.Load(AppDomain.CurrentDomain.GetAssemblies()) 但由于某种原因,这不起作用。 有人可以帮忙吗?

C# – Ninject,IoC和工厂模式

我有一个控制台应用程序,我需要根据用户的输入执行某个function。 如果用户输入“function1” – >我执行function1,依此类推。 我正在尝试将此项目编写为尽可能干净且通用,我想使用IoC和SOLID概念,我有点卡住了。 到目前为止我所拥有的: public interface IFeature { String execFeature(); } 和 interface IFeatureFactory { IFeature createFeature(String input); } 我的第一个想法只是在具体的Factory类上有一个关于用户输入的开关案例 ,并相应地创建具体的function ,但我敢打赌,有一个更好的方法来使用IoC 。 我读了Ninject工厂扩展,但不明白如何在我的项目中使用它。 使用IoC / Ninject进行工厂模式的最佳方法是什么?

Ninject和配置

我以前使用Castle作为IoC但我在同一个项目中使用Nhibernate / Castle(IoC)时遇到了问题,所以我搬到了Ninject。 现在回答这个问题,我有这个课程: class CustomModule : NinjectModule { public override void Load() { Bind().To (); } } Concrete是一个单独的项目, Interfaces.ICafe是一个不同的项目。 使用Castle我曾经给开发人员提供接口DLL并要​​求他实现一个新的具体实现该接口,然后使用app.config配置它,所以无论他实现什么类名,它仍然有效,因为他必须写入app.config,所以如果他像Concrete.Coffee它仍然可以工作。 但是对于Ninject,他必须使用相同的类名“Tea”来制作一个混凝土,以使其工作,否则它将无法工作,因为它是硬编码的。 我是Ninject的新手,我知道可能有些东西我不见了?

Ninject。 对内部集合属性的奇怪拦截

域对象: TargetObject.cs public class TargetObject { public virtual ChildTargetObject ChildTargetObject { get { return ChildTargetObjectInner; } set { ChildTargetObjectInner = value; } } public virtual ChildTargetObject ChildTargetObjectInner { get; set; } } 配置和测试: var settings = new NinjectSettings { InjectNonPublic = true, AllowNullInjection = true }; var kernel = new StandardKernel(settings); kernel.Bind().ToSelf(); kernel.InterceptReplaceSet(t => t.ChildTargetObjectInner, […]

Ninject Conventions是否仅适用于公共课程?

我开始在我的项目中使用Ninject来自动绑定抽象类的所有子类。 对此的绑定是 – 简单易行 – 如下: kernel.Bind(x => x.FromThisAssembly() .SelectAllClasses(). .InheritedFrom() .BindBase()); 但是,我发现这不起作用。 经过一些实验,我发现这个不起作用的原因是我的所有实现(和抽象类)都标记为内部 。 我可以想象这是一些安全function,以防止绑定从内部泄漏到外部。 但我可以为这些类添加显式绑定。 因此,我的问题是:有人知道这是否是预期的行为? 有没有办法解决这个问题,除了让我的所有课程都公开?