Tag: dependency injection

使用primitive-arguments构造函数注册一个类型?

我有一个类在其构造函数中有一些原始类型参数,如字符串等。 我应该如何使用统一容器注册类型? public LoginManager( IRegionManager regionManager, IEventAggregator eventAggregator, string mainRegionName, Uri login, Uri target) { this.regionManager = regionManager; this.eventAggregator = eventAggregator; this.mainRegionName = mainRegionName; this.login = login; this.target = target; } } 更新 : 请记住, IRegionManager和IEventAggregator是Prism UnityBootstrapper的已知类型,在我的情况下是容器包装器。 我必须重新注册吗? 我想保持类型注册尽可能简单。 这会被视为坏习惯吗? 有更好的选择吗?

装饰ASP.NET Web API IHttpController

我正在尝试使用装饰器来包装Web API控制器( IHttpController实现),但是当我这样做时,Web API会抛出exception,因为不知何故它会期待实际的实现。 将装饰器应用于控制器是我成功应用于MVC控制器的一个技巧,我显然希望在Web API中也这样做。 我创建了一个自定义的IHttpControllerActivator ,它允许解析修饰的IHttpController实现。 这是一个剥离的实现: public class CrossCuttingConcernHttpControllerActivator : IHttpControllerActivator { private readonly Container container; public CrossCuttingConcernHttpControllerActivator(Container container) { this.container = container; } public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) { var controller = (IHttpController)this.container.GetInstance(controllerType); // Wrap the instance in one or multiple decorators. Note that in reality, the // […]

使用带有SignalR的Autofac时的范围错误

我正在尝试在SignalR中心注入一个HttpContextBase : public class EventHub : Hub, IDisconnect { private readonly HttpContextBase _httpContextBase; public EventHub(HttpContextBase httpContextBase) { _httpContextBase = httpContextBase; } […] } 注册码如下所示: private static void InitAutofac() { var builder = new ContainerBuilder(); var assembly = typeof (MvcApplication).Assembly; builder.RegisterControllers(assembly).PropertiesAutowired(); builder.RegisterModule(new AutofacWebTypesModule()); builder.RegisterFilterProvider(); builder.RegisterAssemblyTypes(assembly) .Where(InterfaceBasedInjectedClasses()) .AsImplementedInterfaces() .InstancePerLifetimeScope(); builder.RegisterAssemblyTypes(assembly) .Where(InterfaceLessInjectedClasses()) .InstancePerLifetimeScope(); builder.RegisterType().InstancePerLifetimeScope(); builder.RegisterType().InstancePerLifetimeScope(); var container = […]

dependency injection与程序集依赖关系

说,我有以下项目结构: Application BusinessLogic DataAccessLayer 我已准备好使用穷人dependency injection的所有类型,现在我想用Unity引入真实的类型。 但是我在努力放置依赖容器及其配置的位置(我想我会从代码中配置它)。 DataAccessLayer需要注册Context(EF) BusinessLogic需要注册数据存储库(使用上下文) 应用程序需要注册服务(使用存储库) 目前,使用容器实际实例化类的唯一程序集将是Application。 所以我有以下依赖关系图: DI使用DataAccessLayer DI使用BusinessLogic DI使用Application 应用程序使用DI 我在这里有循环引用,所以将DI放在Application中似乎是合法的。 但是我必须引用DataAccessLayer ,这是我不想创建的依赖项。 我该如何解决这个问题?

为什么CastleWindsor的BeginScope超出范围?

我正在尝试将Castle Windsor添加到我的Web API项目中,并且正在关注此post ,但是在这行代码中遇到编译时错误: this._scope = container.BeginScope(); …作为“ ‘Castle.Windsor.IWindsorContainer’不包含’BeginScope’的定义,并且没有扩展方法’BeginScope’接受类型’Castle.Windsor.IWindsorContainer’的第一个参数可以找到(你是否错过了使用指令或汇编参考?) “ 这是整个代码,因此可以在上下文中看到: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Http.Dependencies; using Castle.Windsor; using Castle.MicroKernel.Registration; using System.Web.Http; namespace PlatypiPieServer { public class WindsorDependencyResolver : IDependencyResolver { private readonly IWindsorContainer _container; public WindsorDependencyResolver(IWindsorContainer container) { _container = container; } public IDependencyScope BeginScope() { return new WindsorDependencyScope(_container); […]

无法使用Unity引导程序为ASP.NET Web API nuget包注入System.Web.Http.Filters.ActionFilterAttribute

我无法使用Unity Web API API nuget包的Unity引导程序使用自定义ActionFilterAttribute类进行dependency injection。 我在UnityConfig中注册了这个类型,我在其他地方使用它(虽然使用构造函数注入)但它工作正常。 public static void RegisterTypes(IUnityContainer container) { container.RegisterType(); … } 代码被成功调用,但实例化对象(settingService)为null。 public class APIKeyValidationAttribute : ActionFilterAttribute { [Dependency] public ISettingService settingService { get; set; } public override void OnActionExecuting(HttpActionContext actionContext) { … if (settingService == null) { throw new Exception(“settingService is null”); } … } 为了让这个工作,我需要做什么? 我已经搜索了很长时间,只能找到MVC或具有不同dependency injection器的Web API的示例。

AWS Lambda环境变量和dependency injection

在将AWS Lambda与.NET Core v1.0一起使用时,是否有可用于使用dependency injection或模拟环境变量的最佳实践或文档? 作为一个例子,下面是一个示例Lambda函数ProcessKinesisMessageById ,它接受KinesisEvent并进行某种处理。 此处理的一部分涉及访问需要访问环境变量以进行设置的某种外部服务(如AWS S3或数据库)。 public class AWSLambdaFileProcessingService { private IFileUploadService _fileUploadService; // No constructor in the Lambda Function [LambdaSerializer(typeof(JsonSerializer))] public void ProcessKinesisMessageById(KinesisEvent kinesisEvent, ILambdaContext context) { Console.WriteLine(“Processing Kinesis Request”); _fileUploadService = new AWSFileUploadService(); // Can this be injected? (Constructor shown below) // some sort of processing _fileUploadService.DoSomethingWithKinesisEvent(kinesisEvent); } } // […]

使用插件覆盖autofac注册

我有一个由DefaultFoo实现的IFoo服务,我已经在我的autofac容器中注册了它。 现在我想允许在插件程序集中实现IFoo的替代实现,可以将其放在“plugins”文件夹中。 如果存在,如何配置autofac以优先选择此替代实现?

如何使用autofac注册两个WCF服务合同

我有一个WCF服务,实现了两个服务合同…… public class MyService : IService1, IService2 我自我托管服务…… host = new ServiceHost(typeof(MyService)); 当服务只实现一个服务合同时,一切都工作正常,但是当我尝试设置autofac来注册这两个时: host.AddDependencyInjectionBehavior(_container); host.AddDependencyInjectionBehavior(_container); …它在第二个引发exception,报告: 该值无法添加到集合中,因为该集合已包含相同类型的项:’Autofac.Integration.Wcf.AutofacDependencyInjectionServiceBehavior’。 此集合仅支持每种类型的一个实例。 乍一看,我认为这是说我的两个合同在某种程度上被视为相同的类型,但在二读时我相信它是说AutofacDependencyInjectionServiceBehavior是有问题的类型,即我不能使用它两次! 然而,我发现这篇文章明确显示多次使用它的forms略有不同: foreach (var endpoint in host.Description.Endpoints) { var contract = endpoint.Contract; Type t = contract.ContractType; host.AddDependencyInjectionBehavior(t, container); } 不幸的是,这给出了同样的错误信息。 是否可以在一项服务上注册多个服务合同,如果是,如何?

我如何使用断路器?

我正在寻找在我的控制之外远程调用服务的方法,直到连接成功为止。 我也不想简单地设置一个定时器,每隔n秒/分钟执行一次动作,直到成功为止。 经过一系列研究后,似乎断路器模式非常适合。 我找到了一个使用Castle Windsor拦截器的实现,看起来很棒。 唯一的问题是我不知道如何使用它。 从我发现的关于该主题的几篇文章中,我能够找到的唯一用法示例是简单地使用断路器仅调用一次动作,这似乎不太有用。 从那看起来我需要在一段while(true)循环中使用断路器简单地运行我的动作。 我如何使用Windsor拦截器执行一个动作来调用外部服务,直到它成功而不会关闭我们的服务器? 有人可以填写缺失的部分吗? 这是我能想到的 while(true) { try { service.Subscribe(); break; } catch (Exception e) { Console.WriteLine(“Gotcha!”); Thread.Sleep(TimeSpan.FromSeconds(10)); } } Console.WriteLine(“Success!”); public interface IService { void Subscribe(); } public class Service : IService { private readonly Random _random = new Random(); public void Subscribe() { var a = _random.Next(0, […]