Tag: dependency injection

Simple Injector在BaseClass中注入多个依赖项

我有一个BaseViewModel ,它由多个ViewModel类inheritance。 在我的BaseViewModel我有一些从ViewModel注入的依赖项。 现在,如果我需要在BaseViewModel添加新的依赖项,我需要更改inheritanceBaseViewModel所有VM。 请告诉我如何在Simple Injector中处理它。 以下是我的代码结构: 如何使我的基类注入独立,以便我不需要在所有inheritance的类中进行更改? 码: public class BaseViewModel { protected readonly IAESEnDecrypt AESEnDecrypt; protected readonly IDataService DataService; protected readonly INavigationService NavigateToPage; public BaseViewModel(INavigationService nav, IDataService data, IAESEnDecrypt encrypt) { AESEnDecrypt= encrypt; NavigateToPage = nav; DataService = data; } } public class ViewModel { public ViewModel(INavigationService nav, IDataService data, IAESEnDecrypt encrypt) : […]

在IServiceCollection扩展中获取服务

我有这个扩展名 public static class ServiceCollectionExtensions { public static IServiceCollection MyExtension(this IServiceCollection serviceCollection) { … } } 我需要从这样的服务获取信息: services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => { var myService = <>(); options.TokenValidationParameters = this.GetTokenValidationParameters(myService); }); 我怎样才能做到这一点? 我尝试在var serviceProvider = services.BuildServiceProvider();之后获取ServiceProvider var serviceProvider = services.BuildServiceProvider(); 然后我发送serviceProvider ,但这不起作用..

EF ObjectContext,Service and Repository – 管理上下文生命周期。

我是MVP和entity framework世界的新手,所以请耐心等待。 我目前有一个View + Presenter组合,视图有两个事件Edit和Delete,演示者只是监听这些事件。 我还有一个服务对象和存储库设置。 服务层采用一些存储库实现,这些实现采用ObjectContext,因此构造的顺序是(将顶层对象传递给它下面的对象: ObjectContext | V Repositries | V Service Object | V Presenter 现在的问题是,当我在顶部创建对象上下文时,它一直存在,演示者处于活着状态,这意味着编辑和删除使用来自服务的相同上下文实例。 因此,调用ServiceObject.Delete和ServiceObject.Edit会使用相同的上下文,这使得很难管理更改跟踪。 根据我的理解,上下文应该只是短暂的,只有一个工作单元,对我来说编辑和删除都是不同的工作。 您如何使用entity framework进行DI并仍然管理上下文生命周期? 我看到人们刚刚在存储库中新建了对象上下文,这是一个很好的模式。 或者我应该在服务对象中执行此操作,例如: ServiceObject{ public void Edit(// some args) { Using(var context = new MyObjectContext) { var repo = new MyRepo(context); var entity = repo.GetForID(12); // Do some stuff for edit context.SaveChanges(); } […]

IOC / DI:注册混凝土类型代码气味?

在我目前的项目中,我一直在努力解决这个问题。 我遇到过一些我没有(并且不需要)实现任何特定接口的具体类型的情况。 有时我希望通过容器进行解析,因为类型是在singleon生命周期中注册的; 有时,类型具有构造函数参数,这些参数是较大对象图的一部分,或者自身在单例生命周期中注册。 当我输入如下代码时,我总觉得有点奇怪: Container.RegisterType(); 有关这是代码气味还是违反使用IOC容器的最佳做法的任何想法?

使用Castle在自定义成员资格提供程序中注

到目前为止,在阅读有关注入自定义会员提供商的可能性时,我发现了两种可能的方法: 一个是以下内容: http : //bugsquash.blogspot.com/2010/11/windsor-managed-membershipproviders.html 在这里,作者基本上建议注册你的自定义提供程序,然后有一个相当可疑的windsor适配器的成员资格(我真的不喜欢它使用从HttpApplication获取的容器实现你的提供者的方式,它最终包含windsor适配器)。 这是另一个类似的选项: http : //code.google.com/p/webdotnet/source/browse/trunk/Steeg.Framework/Web/Security/MemberShipProvider.cs?r = 2 你只需重写Initialize()并在那里手动实例化依赖项。 至少在第一个中,您不需要手动实例化依赖项(除了提供程序本身)。 还有一些还建议使用某种服务定位器(MVC或其他) 然后我遇到了ninject注入依赖于Membership.Provider上的属性,而不是像_kernel.Inject(Membership.Provider)那样容易。 这更接近我想要的东西,保持构图根本概念,这使我首先使用DI。 如何使用城堡获得类似的结果? 更新:显然这有生命周期管理的问题。 使用Ninject将存储库注入自定义成员资格提供程序 我应该选择#1选项吗? 至少我自己实例提供者。 因此,生命周期管理不应成为问题。

看似循环的依赖导致Castle Windsor的问题

我有一个IUserService(和其他服务),我在ServiceInstaller.cs中批量注册: container.Register( AllTypes.FromAssemblyContaining() .Where(type => type.Name.EndsWith(“Service”)) .WithService.DefaultInterface() .Configure(c => c.LifeStyle.Singleton) ); 然后,我有IAuthenticationService,我在我的通用WindsorInstaller.cs文件中注册: container.Register(Component.For(typeof (IAuthenticationService)) .ImplementedBy(typeof(AuthenticationService))); 现在一切正常,直到我在UserService中为IAuthenticationService添加了一个公共属性。 当事情被注册时,似乎存在循环依赖或某些时间问题,因为我收到错误: Can’t create component ‘ABCD.Services.UserService’ as it has dependencies to be satisfied. ABCD.Services.UserService is waiting for the following dependencies: Services: – ABCD.Services.Interfaces.IAuthenticationService which was registered but is also waiting for dependencies. ABCD.Services.AuthenticationService is waiting for the following dependencies: Services: […]

dependency injection

我们正在构建一个Windows桌面应用程序(不是基于Web的),并尝试提出实现Repository和UnitOfWork Pattern的最佳方法。 在典型的Asp.Net Mvc应用程序中,您的存储库注入数据上下文,服务注入存储库,最后控制器注入服务,如果您没有遇到任何exception,一切都很好,您将提交更改。 在Windows窗体/ wpf应用程序中,建议不要使用单个datacontext( Oren在MSDN上有一个post),所以我们决定在演示者处创建数据上下文。 我们正在使用Linq2SQl,我们有两个不同的数据库可以根据视图使用。 目前我有以下实施方案 public interface IRepository where T : class { IEnumerable Find(Expression<Func> where); T Single(Expression<Func> where); … } public class Repository : IRepository where T : class { private readonly Table _table; public Repository(DataContext dataContext) { _table = dataContext.GetTable(); } } public Class TodoService :ITodoService { IRepository _todoRepository; […]

如何在mvc 4上通过统一在控制器中注入构造函数

我正在使用Unity 1.1版本,我无法注入构造函数。 我的代码是: 在global.asax中注册依赖项Application_Startup方法: Core.Instance.Container.RegisterType(); 注入构造函数: private ICartBusiness _business; public FooController(ICartBusiness business) { _business = business; } mvc抛出此exception: 没有为此对象定义无参数构造函数。 PS:我不能使用任何新版本的统一,因为我使用过于引用的旧dll所以我不能使用unity.WebApi或unity.Mvc3 dlls。 这该怎么做?

如何使用Simple Injector依赖项的WPF控件

我想在我必须将资源注入GUI控件的场景中使用dependency injection。 因为这可能是错误的地方,我有一些理由在这里做而不是在视图模型中(例如,我需要Window句柄等)。 构造函数参数注入似乎是首选方式。 正如大多数人所知,WPF控件必须具有无参数构造函数,否则XAML不起作用,对于当前场景,我喜欢保留我的XAML,因为它包含一些名称注册和绑定。 那么:我如何在WPF + XAML场景中使用构造函数-DI(如果可能的话,在Simple Injector的情况下)? 是否存在标记扩展,或者XAML解析器是否可以成为Container-Aware并接受具有参数的构造函数作为控件? 方案示例: 和: public class WhateverResourceNeedingViewer : ItemsControl { public WhateverResourceNeedingViewer(Dep1 d, DepResource d2) { … } … }

dependency injection和项目引用

我正在尝试了解DI,以便更好地了解IoC以及其他好处。 Pre DI,我有一个项目,它有一个UI项目(MVC),一个BusinessLogic项目和一个DataAccess项目。 我也有一个SharedLib项目。 所有项目都引用了SharedLib。 UI引用了BusinessLogic,BusinessLogic引用了DataAccess。 我想现在添加接口。 所以我转到我的DataAccess,并为每个类添加一个接口,并用他们的方法填充它们。 我对业务逻辑层也这样做。 但是为了注入我在UI项目中的BusinessLogic类中实例化的DataAccess类,我需要对我的Data项目的引用,因为UI项目(正确地,我认为)不知道’IDataAccess’接口是什么。 我能看到的唯一解决方法是在我的UI中将项目引用添加到我的DA项目中 – 这似乎是错误的。 如果我尝试添加Unity作为我的容器(将来的一天,一旦我弄清楚这一切是如何工作的),并希望在UI项目中初始化我的接口/类关系 – 同样的问题。 也许接口必须进入某个共享项目? 还是一个项目? 应如何处理?