Tag: autofac

Autofac:隐藏一个复合材料背后的多个逆变实现

我被这个关于(.NET 4.0)协方差和逆向支持Autofac的问题引发了,现在我正在努力实现类似的东西,但没有任何运气。 我想要实现的是以这样的方式配置Autofac:当我解析单个具体的IEventHandler (为了使用container.Resolve进行演示,但通常使用构造函数注入),Autofac将返回一个MultipleDispatchEventHandler包装所有可从请求的处理程序分配的已注册事件处理程序。 换句话说,当我写这个: var handler = container .GetInstance<IEventHandler>(); handler.Handle(new CustomerMovedEvent()); 关于应用程序设计(如下所示),我希望返回一个包装CustomerMovedEventHandler和NotifyStaffWhenCustomerMovedEventHandler的MultipleDispatchEventHandler 。 这是应用程序设计: // Events: public class CustomerMovedEvent { } public class CustomerMovedAbroadEvent : CustomerMovedEvent { } public class SpecialCustomerMovedEvent : CustomerMovedEvent { } // Event handler definition (note the ‘in’ keyword): public interface IEventHandler { void Handle(TEvent e); } // Event handler […]

DependencyResolver.SetResolver不工作

我正在尝试使用Dependency.SetResolver方法在新应用程序上设置容器,并使用autofac与autofac mvc 5集成。 问题是设置解析器似乎没有做任何事情。 将始终使用默认解析程序,并始终需要默认构造函数。 有任何想法吗? 编辑 – global.asax.cs ,我把它简化为: var b = new ContainerBuilder(); b.RegisterType().As().InstancePerHttpRequest(); var container = b.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); HomeController在其构造函数中使用IUserSession 。 抛出的exception是“ No parameterless constructor defined for this object.” Thrown from “System.Web.Mvc.DefaultControllerActivator.Create” No parameterless constructor defined for this object.” Thrown from “System.Web.Mvc.DefaultControllerActivator.Create”

Autofac:批量注册开放generics类型

我得到了一个具有许多实现IHandler具体类型的程序集,如下所示: public class MoveCustomerHandler : IHandler { void IHandler.Handle(MoveCustomerCommand c) { // some business logic for moving a customer. } } 目前,我正按照以下方式逐一注册: builder.RegisterType() .As<IHandler>(); builder.RegisterType() .As<IHandler>(); builder.RegisterType() .As<IHandler>(); // Many handler registrations here… 使用构造函数注入注入命令处理程序,如下所示: public class OrderController { private readonly IHandler handler; public OrderController(IHandler handler) { this.handler = handler; } } 有没有办法使用Autofac以简单的方式批量注册我的所有处理程序?

Autofac复合图案

我注意到我经常需要实现复合模式。 例如: interface IService { … } class Service1 : IService { … } class Service2 : IService { … } class CompositeService : IService { public CompositeService(IEnumerable services) { … } … } 我想在容器中注册CompositeService作为IService并注入依赖项。 (看起来有点类似于装饰者,但装饰一组服务而不是一个) 在autofac中执行此操作的最佳方法是什么? 理想的解决方案将如何(对于C#)? 更新: 我目前的注册是: builder.RegisterType().Named(“impl”); builder.RegisterType().Named(“impl”); builder.Register(c => new CompositeService(c.Resolve<IEnumerable>(“impl”))) .As(); 它类似于装饰手工在http://nblumhardt.com/2011/01/decorator-support-in-autofac-2-4 可以改进吗?

DI / IoC容器性能基准比较?

我在这里找到了一些用于测试几个顶级.NET DI / IoC容器性能的2008年基准测试结果。 但我无法找到任何更新的结果。 是否有任何基准测试可以比较一些大的IoC容器(StructureMap,Unity,Ninject,Autofac,Castle Windsor等)?

让autofac与mvc6 beta5一起使用

我正在尝试使用我正在处理的mvc6应用程序使用autofac。 我发现这篇博客文章似乎有点过时了。 它看起来像使用beta3位 我正在使用这个clr版本 1.0.0-beta5-11911 我的项目有这两个参考 “Autofac”: “4.0.0-alpha2”, “Autofac.Dnx”: “4.0.0-alpha2”, 在文章中讨论了如何修改startup.cs // Create the Autofac container builder. var builder = new Autofac.ContainerBuilder(); // Add any Autofac modules or registrations. builder.RegisterModule(new AutofacModule()); // Populate the services. builder.Populate(services); // Build the container. var container = builder.Build(); return container.Resolve(); 上面的代码抱怨builder.Populate(services); 给我一个错误 “IServiceDescriptor”类型在未引用的程序集中定义。 您必须添加对程序集“Microsoft.Framework.DependencyInjection.IServiceDescriptor,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = […]

使用Autofac的RegisterGeneric注入NLog

注意:更新了建议的改进,更接近但仍然不完全! 与此问题类似 – 使用Autofac传递NLog的声明类的类型 – 我试图将NLog实例注入我的存储库类。 接口: public interface ILogger where T: class { … } 执行: public class NLogger : ILogger where T: class { private readonly Logger _logger; public NLogger() { _logger = LogManager.GetLogger(typeof(T).FullName); } public void Debug(string message) { _logger.Debug(message); } … } 在Autofac注册为: builder.RegisterGeneric(typeof (NLogger)).As(typeof (ILogger)); 使用断点,我看到Autofac正在创建一堆ILogger / NLogger,其中包含所有各种存储库的正确类型,但生成的日志显示为callsite为“NLog.LoggerImpl.Write”。 谢谢你的帮助! 使用generics的工作解决方案: […]

使用日志注入模块时,在Autofac中显式解析ILog

我使用以下代码为所有需要它的类注册log4net。 public class LogInjectionModule : Module { private readonly string _configPath; public LogInjectionModule(string configPath) { _configPath = configPath; } protected override void AttachToComponentRegistration(IComponentRegistry registry, IComponentRegistration registration) { XmlConfigurator.Configure(new FileInfo(_configPath)); registration.Preparing += OnComponentPreparing; } private static void OnComponentPreparing(object sender, PreparingEventArgs e) { var t = e.Component.Activator.LimitType; e.Parameters = e.Parameters.Union(new[] { new ResolvedParameter((p, i) => p.ParameterType == […]

Autofac解决CQRS CommandDispatcher中的依赖关系

我正在尝试实现一个简单的CQRS应用程序示例。 这是我的“命令”部分的结构: public interface ICommand { } //base interface for command handlers interface ICommandHandler where TCommand: ICommand { void Execute(TCommand command); } // example of the command public class SimpleCommand: ICommand { //some properties } // example of the SimpleCommand command handler public class SimpleCommandHandler: ICommandHandler { public void Execute(SimpleCommand command) { //some logic } […]

注册时是否可以指定多个Autofac生命周期范围?

我正在使用带有MVC4附加组件的Autofac IoC容器,该附加组件提供InstancePerHttpRequest生命周期范围。 但是在我的项目中,我有web,web-api和后台工作线程。 在下面的示例中,我假设InstancePerHttpRequest范围在不是源自Web请求时并不意味着什么。 builder.RegisterType().As() .InstancePerHttpRequest() 我想知道是否有可能做类似下面的例子并让容器选择最合适的生命周期范围? builder.RegisterType().As() .InstancePerHttpRequest() .InstancePerApiRequest() .InstancePerDependency(); 在这种情况下,我打算发生的是,如果请求来自Web请求,那么它将选择InstancePerHttpRequest范围,如果它来自webApi请求,它将选择InstancePerApiRequest范围,如果它被应用程序工作线程使用,它将使用InstancePerDependency范围? 任何想法,如果这或类似的东西是可能的? 谢谢