Tag: dependency injection

ASP.NET 5 / MVC 6中基于约定的绑定

可以手动注册依赖项: services.AddTransient(); services.AddTransient(); 当依赖关系太多时,手动注册所有依赖项变得很困难。 在MVC 6(beta 7)中实现基于约定的绑定的最佳方法是什么? PS在以前的项目中,我使用Ninject和ninject.extensions.conventions 。 但我找不到MVC 6的Ninject适配器。

架构问题:使用dependency injection导致垃圾API

我想创建一个类来执行各种与数据库相关的低级操作,但是它提供了一个非常简单的UI层接口。 此类表示特定聚合根中的一组数据,由单个ID int检索。 构造函数有四个参数: public AssetRegister(int caseNumber, ILawbaseAssetRepository lawbaseAssetRepository, IAssetChecklistKctcPartRepository assetChecklistKctcPartRepository, User user) { _caseNumber = caseNumber; _lawbaseAssetRepository = lawbaseAssetRepository; _assetChecklistKctcPartRepository = assetChecklistKctcPartRepository; _user = user; LoadChecklists(); } UI层通过IAssetRegister接口访问此类。 Castle Windsor可以提供ILawbaseAssetRepository和IAssetChecklistKctcPartRepository参数本身,但UI代码需要使用匿名类型提供其他两个: int caseNumber = 1000; User user = GetUserFromPage(); IAssetRegister assetRegister = Moose.Application.WindsorContainer.Resolve(new { caseNumber, user}); 从API设计的角度来看,这是垃圾。 UI层开发人员无法知道IAssetRegister需要整数和用户。 他们需要知道类的实现才能使用它。 我知道我必须在这里遇到某种设计问题。 任何人都可以给我一些指示吗?

.NET Core IServiceScopeFactory.CreateScope()vs IServiceProvider.CreateScope()扩展

我的理解是,当使用内置dependency injection时,.NET Core控制台应用程序将要求您自己创建和管理所有范围,而ASP.NET Core应用程序将默认通过定义的中间件创建和管理HttpRequest范围(s )。 使用ASP.NET Core,您可以选择创建和管理自己的范围,通过在需要HttpRequest之外的服务时调用CreateScope() 。 很明显,每次调用IServiceScopeFactory.CreateScope()都会创建一个新的IServiceScope ; 但是,调用IServiceProvider.CreateScope()扩展方法是否每次都会创建一个新的IServiceScope ? 基本上,在ASP.NET Core和.NET Core控制台应用程序中创建范围的以下方法之间是否存在有意义的差异: public class Foo() { public Foo(IServiceProvider serviceProvider) { using(var scope = serviceProvider.CreateScope()) { scope.ServiceProvider.GetServices(); } } } 和 public class Bar() { public Bar(IServiceScopeFactory scopeFactory) { using(var scope = scopeFactory.CreateScope()) { scope.ServiceProvider.GetServices(); } } }

私有只读接口 – 它是多余的吗?

我正在为我的项目使用IoC和DI。 但是我想知道以下是否是一个好习惯: private readonly IMyService myservice; 作为服务使用者的类中的字段。 该字段在构造函数中设置。 我确定我已经在某个地方看到了这个并且我已经接受了它。 但是我也看到: private IMyService myservice; 这似乎就足够了。 是否有任何目的为注入的服务接口提供只读字段? 有什么好处?

解耦视图,演示文稿和ASP.NET Web窗体

我有一个ASP.NET Web窗体页面,演示者需要在其中填充控件。 这种交互对页面生命周期有点敏感,我想知道是否有一个技巧,我不知道。 我想要对整个事情保持实用,但不要牺牲可测试性。 目前我有这个: public interface ISomeContract { void InstantiateIn(System.Web.UI.Control container); } 这个契约依赖于System.Web.UI.Control,我需要能够使用ASP.NET Web Forms编程模型。 但是视图和演示者都不了解ASP.NET服务器控件。 我该如何解决这个问题? 如何在我的具体视图中使用ASP.NET Web窗体编程模型而不在合同程序集中使用System.Web.UI.Control依赖项? 为了澄清一点,这种类型的界面都是关于UI组合(使用MEF)。 它在整个框架中是众所周知的,但它实际上只是在具体视图中调用。 具体视图仍然是唯一知道ASP.NET Web窗体的东西。 但是,那些说InstantiateIn(System.Web.UI.Control)公共方法存在于我的合同程序集中,这意味着对ASP.NET Web窗体的依赖。 我一直在考虑一些双重调度机制甚至访问者模式来尝试解决这个问题,但我还不知道我想去哪个方向,我真的希望对此事有一些意见。

如何在模型创建期间覆盖ASP.NET MVC 3默认模型绑定器以解析依赖关系(使用ninject)?

我有一个ASP.NET MVC 3应用程序,它使用Ninject来解决依赖关系。 到目前为止,我所要做的就是使Global文件inheritance自NinjectHttpApplication ,然后重写CreateKernel方法以映射我的依赖项绑定。 之后,我能够在我的MVC控制器构造函数中包含接口依赖项,并且ninject能够解析它们。 一切都很棒。 现在我想在模型绑定器中解决依赖关系,当它创建我的模型的实例时,但我不知道如何做到这一点。 我有一个视图模型: public class CustomViewModel { public CustomViewModel(IMyRepository myRepository) { this.MyRepository = myRepository; } public IMyRepository MyRepository { get; set; } public string SomeOtherProperty { get; set; } } 然后我有一个接受视图模型对象的action方法: [HttpPost] public ActionResult MyAction(CustomViewModel customViewModel) { // Would like to have dependency resolved view model object here. } […]

AuthorizationOptions上的dependency injection

我正在为我的ASP.NET 5 MVC应用程序创建授权规则/策略。 创建它很简单,很容易做到,它正在工作(我的基本测试)。 但是,我现在需要将我的数据上下文纳入需求。 我在IAuthorizationRequirement实现中创建了一个构造函数,它接受一个实现DbContext的MyContext对象。 我正在我的Startup.cs文件中注册IAuthorizationRequirement。 services.Configure(options => { options.AddPolicy(“AllowProfileManagement”, policy => policy.Requirements.Add( new AllowProfileManagementRequirement(new MyRepository(new MyContext())))); }); 不幸的是,当我的规则运行时, MyContext不知道所使用的连接字符串(在Startup.cs更远): services.AddEntityFramework() .AddSqlServer() .AddDbContext(options => options.UseSqlServer(Configuration[“Data:DefaultConnection:ConnectionString”])); 我正在使用DI这些类型(并且它正在工作)。 services.AddTransient( provider => new MyRepository(provider.GetRequiredService())); 我知道我在做什么是不对的,但我不知道如何做到这一点,以便DI被用于所有事情。

简单的注射器条件注射

假设我有两个控制器:ControllerA和ControllerB。 这两个控制器都接受参数IFooInterface。 现在我有2个IFooInterface,FooA和FooB的实现。 我想在ControllerA中注入FooA,在ControllerB中注入FooB。 这很容易在Ninject中实现,但由于性能更好,我正在转向Simple Injector。 那么我怎样才能在Simple Injector中做到这一点? 请注意,ControllerA和ControllerB驻留在不同的程序集中并动态加载。 谢谢

ASP.Net MVC 4 Custom ValidationAttributedependency injection

在我目前正在开发的ASP.Net MVC 4应用程序中,有许多具有仓库属性的模型。 我希望所有这些模型都有validation,以确保输入的仓库是有效的仓库。 看起来最简单的方法是使用自定义ValidationAttribute类。 然后validation代码将被集中,我可以将属性添加到每个模型中的属性。 我需要调用一个服务来确保仓库是一个有效的仓库。 我有一个代表此服务的接口,我使用Ninject在我使用此服务的应用程序中执行dependency injection。 这样我就可以使用模拟并轻松地对应用程序进行unit testing。 我希望我的自定义ValidationAttribute类在使用此服务时使用dependency injection。 这是我创建的类: public class MustBeValidWarehouse : ValidationAttribute { public override bool IsValid(object value) { if (value is string) { string warehouse = value.ToString(); NinjectDependencyResolver depres = new NinjectDependencyResolver(); Type inventServiceType = typeof(IInventService); IInventService inventserv = depres.GetService(inventServiceType) as IInventService; return (inventserv.GetWarehouses().Where(m => m.WarehouseId == […]

使用Ninject工厂方法将IEnumerable注入构造函数

我正在尝试使用Ninject将IEnumerable注入构造函数中。 我的构造函数看起来像这样: public MatrixViewModel(IEnumerable fooViewModels) { _fooViewModels = fooViewModels; } 我的Ninject模块如下所示: public class MainModule : NinjectModule { public override void Load() { Bind<IEnumerable>() .ToMethod(context => GetFooViewModels()) .InSingletonScope(); // this binding is not working } private IEnumerable GetFooViewModels() { // returns a bunch of foo view models } } 这似乎不起作用。 我没有得到任何错误。 Ninject只是不使用绑定,传递给构造函数的值基本上只是一个空的默认值。 你如何使用Ninject注入IEnumerable ? 编辑 关于我工厂方法的更多细节: […]