Tag: dependency injection

如何避免服务定位器模式? 我是不是该?

我正在开发一个WinForms系统(我知道),在创建表单时有很多Constructor Injection ,但如果这些表单/视图需要打开另一个表单,我发现DI容器已经注入,以便我们可以找到在运行时实现所需的视图接口。 例如 public partial class MyView : Form, IMyView { private readonly IDIContainer _container; public MyView(IDIContainer container) { InitializeComponent(); _container = container; } public OpenDialogClick(object sender, EventArgs e) { var dialog = container.Resolve(); dialog.ShowDialog(this); } } 我知道这基本上是使用容器作为服务定位器。 我一再被告知这被认为是一种反模式,所以我想避免这种用法。 我可以将视图作为构造函数的一部分注入,如下所示: public partial class MyView : Form, IMyView { private readonly IDialogView _dialog; public MyView(IDialogView […]

通过通用接口/抽象类实现使.NET Core DI自动解析类

.NET Core中是否有一种方法可以注册通用接口,并使其解析与某个实现相匹配的类。 例如,我有以下界面: public interface IMapper { } 我还有一个抽象类: public abstract class Mapper : IMapper { protected Mapper() { // some generic stuff } public abstract TTo Map(TFrom); } 然后我可以创建一个这样的实现: public class UserMapper : Mapper { public override Entity.User Map(Domain.User from) { // do mapping } } 有没有办法,使用默认的.NET Core DI注册IMapper ,让它自动解析类? 因此,如果我在代码中的某个地方执行此操作: class SomeClass { […]

未能通过Castle Windsor传递通用参数

尝试使用Castle Windsor创建参数化实例时 ,传递generics参数似乎存在问题 未通过通用论证的演示 private static void Main(string[] args) { PassGenericParamAtResolutionTime(); Console.ReadLine(); } private static void PassGenericParamAtResolutionTime() { Console.WriteLine(“Passing generic argument fails”); var container = new WindsorContainer(); container.Register(Component.For<ISandCoordinator>() .ImplementedBy<SandCoordinator>()); var runtimeConstructorParam = new GenericManager( “This Id Does Not Get Through”); var runtimeArguments = new Arguments( new object[] {runtimeConstructorParam}); var shouldBeParameterizedCoordinator = container .Resolve<ISandCoordinator>(runtimeArguments); Console.WriteLine(shouldBeParameterizedCoordinator.Log); } […]

在NInject中实现OnePerSessionBehavior

我想为NInject(v1.0)创建一个OnePerSessionBehavior,我大部分时间都在使用它。 剩下的唯一问题是如何使用.WithArguments()传递新参数,因为每个新会话都要求容器中的内容。 现在我将容器的引用保留为应用程序变量,因此模块只能加载一次,所以绑定只发生一次。 例如,以下内容返回每个新会话的“Something”的单个实例,但传递给所有会话的构造函数参数是相同的DateTime。 Bind() .To() .Using() .WithArgument(“currentDateTime”, DateTime.Now);

什么是IoC容器中的自我绑定?

我已经看到像Ninject这样的框架以及Stack上的post在使用dependency injection框架时会谈到自我绑定,如下面的代码所示。 Bind().To(); 他们甚至达到了具有特殊语法的程度: Bind().ToSelf(); 为什么要将类型绑定到自身? 我没有看到任何实际的应用程序,它可能有用,并有助于减少代码中的依赖性。 这不仅仅意味着对类型的引用会简单地解决它自己吗?

如何在C#/ ASP中的单例中使用作用域依赖项

我是来自Java世界的C#/ ASP的新手。 我读过这篇文章: https : //docs.asp.net/en/latest/fundamentals/dependency-injection.html#service-lifetimes-and-registration-options ,明智地警告注入依赖关系的危险性范围较小。 不幸的是,它没有解释如何在C#/ ASP中解决这个问题。 在Java中有一个Provider的概念 interface Provider { T get(); } 其中有助于解决范围问题:只要某个类型T的绑定是注册,我们就可以注入一个自动生成的Provider 实例而不是T,然后在需要时获取T的实例:a自动生成的Provider确保我们获得适合当前作用域的实例(无论此作用域是什么:HTTP请求,HTTP会话或其他自定义作用域)。 ASP.NET核心内置的标准DI框架没有这样的东西,但我认为在C#中应该很容易实现,因为C#generics不像java那样糟糕( https://docs.oracle.com/ javase / tutorial / java / generics / erasure.html )。 所以我创建了以下类: public class Provider: IProvider { private readonly IServiceProvider serviceProvider; public Provider(IServiceProvider serviceProvider) { this.serviceProvider = serviceProvider; } public T IProvider.Get() { return serviceProvider.GetService(); } […]

使用Simple Injector将依赖项注入OWIN Middleware和每个Web请求

我试图找出如何最好地将我的所有依赖项注入我为Web API应用程序编写的自定义OWIN中间件。 一个简单的例子就是我正在使用的DbContext。 我有一些中间件需要根据请求进行潜在查询。 我遇到的问题是我希望我的DbContext具有WebApiRequestLifestyle范围。 我的DbContext注册如下: container.Register(Lifestyle.Scoped); 显然,这不起作用: container.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle(); 因为我需要在我的中间件中使用MobileDbContext,例如: app.CreatePerOwinContext(() => { return container.GetInstance(); }; 我尝试了一种混合生活方式,但这也没有用,因为我不认为中间件在技术上是不属于“范围”生活方式的东西。 我想,它可能更接近单身人士。 有没有更好的方法来设计我的应用程序,以避免这个问题或通过某种自定义范围的生活方式解决它?

Automapper自定义解析器 – 将存储库注入构造函数

我正在尝试为automapper创建一个自定义解析器,它需要访问我的一个数据存储库来检索登录的用户帐户。 这是我到目前为止的代码…… public class FollowingResolver : ValueResolver { readonly IIdentityTasks identityTasks; public FollowingResolver(IIdentityTasks identitTasks) { this.identityTasks = identitTasks; } protected override bool ResolveCore(Audio source) { var user = identityTasks.GetCurrentIdentity(); if (user != null) return user.IsFollowingUser(source.DJAccount); return false; } } 但是我收到此错误: FollowingResolver’ does not have a default constructor 我尝试添加一个默认的contrstructor,但我的存储库永远不会被初始化。 这是我的autoampper初始化代码: public static void Configure(IWindsorContainer container) { […]

无法使用Simple Injector注册Api控制器?

我有一个使用Simple Injector的WebApi,它工作得非常好,但我必须在项目中实现OAuth。 现在我已经这样做了,我的ApiControllers给了我一个像Simple Injector这样的错误,现在已经正确设置了 我有我的Start.cs文件 public class Startup { public void Configuration(IAppBuilder app) { // Web API configuration and services HttpConfiguration config = new HttpConfiguration(); Container container = SimpleInjectorConfig.Initialize(app); ConfigureAuth(app, container); WebApiConfig.Register(config); app.UseWebApi(config); } public void ConfigureAuth(IAppBuilder app, Container container) { var OAuthServerOptions = new OAuthAuthorizationServerOptions() { AllowInsecureHttp = true, TokenEndpointPath = new PathString(“/token”), AccessTokenExpireTimeSpan […]

如何使用Autofac注入AutoMapper?

将AutoMapper注入其他图层的正确方法是什么? 我读了这篇博文,但是这段代码导致了以下exception AutoMapper.dll中出现“AutoMapper.AutoMapperMappingException”类型的例外,但未在用户代码中处理 当尝试在服务层中映射时。 List list2 = _mapper.Map<List>(list); 我的AutoFac配置如下: public static class DependencyRegistration { public static void Config() { var builder = new ContainerBuilder(); builder.RegisterControllers(typeof(MvcApplication).Assembly); builder.RegisterType().As(); builder.RegisterType().As().WithParameter(“mappers”, MapperRegistry.Mappers).SingleInstance(); builder.Register((ctx, t) => ctx.Resolve()).As().As(); builder.RegisterType().As(); //… var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); } }