Tag: autofac

将Autofac和Moq与Delegate Factories一起使用

我正在尝试对使用工厂注入的类进行unit testing。 我有一个类,它实例化同一个对象的两个副本(使用不同的配置)来控制硬件。 我正在尝试在模拟硬件调用时测试类的行为。 我已经在构造函数中注入了一组工厂委托,以便类可以根据需要实例化硬件类。 但是,我无法解决如何在Autofac.Extras.Moq包中控制或创建工厂方法。 程序包似乎不支持此function。 我正在寻找一个等效的电话: mock.Provide(//created by factory delegate) 我想根据用于实例化HWcontroller的参数创建一个具有行为的特定模拟对象。 我甚至想做什么? class SystemUnderTest { SystemUnderTest(Ia a, Ib b, Ic c, /** 15 other things **/ Func<Func, HwType, IHwManager> HwManagerFactory, Func HwControllerFactory) { } } class HwManager() { public Func<HwType, Func, HwManager> Factory; public HwManager(HwType type, Func ControlFactory) { //Constructor } } 代码我是unit […]

希望Autofac不注册任何具有多个实现的接口

所以我目前正在为我们公司测试Autofac。 我们想要遵守以下规则: 如果一个接口只实现了一次,那么使用builder.RegisterAssemblyTypes自动添加它(见下文)。 否则,我们需要确保手动编写将决定哪个实现是“默认”实现的规则。 我有以下代码: var builder = new ContainerBuilder(); builder.RegisterAssemblyTypes(Assembly .Load(“Lunch.Service”)).As(t => t.GetInterfaces()[0]); builder.RegisterType() .As().SingleInstance(); builder.RegisterModule(new DestinationModule()); builder.RegisterType() .As().PropertiesAutowired(); 现在,它正在工作,但它决定了第一个实现是哪个,并将自动创建。 如果我们不手动创建“规则”,我们希望将其设为手动过程并抛出错误。 这可能吗?

无法使用autofac注册结构实例

我刚开始从Unity迁移到Autofac ,我在尝试注册实例时遇到了问题。 public static void Register(ContainerBuilder containerBuilder, CancellationToken shutDownCancellationToken) { containerBuilder.RegisterType(); containerBuilder.RegisterInstance(shutDownCancellationToken); } 我收到以下错误: “ CancellationToken ”类型必须是引用类型才能在generics类型或方法“ RegistrationExtensions.RegisterInstance(ContainerBuilder, T) ”中将其用作参数“ T ” 任何人都知道如何注册已经创建的结构实例?

有状态服务的dependency injection

我有一个Service Fabric状态服务,它包含一个RunAsync循环和一个OWIN Web API监听器。 是否可以在StatefulServiceinheritance的类和API控制器中添加dependency injection? 我真的只能得到一个或另一个。 如果我将容器逻辑放在Startup.cs中,那么我可以轻松地为Web API控制器获取DI,但不能获得有状态服务。 如果我将容器逻辑放在Program.cs中,那么我可以获得有状态服务而不是web api。 (实际上这感觉更像服务定位器,但在这种情况下我没关系) Program.cs中 private static void Main() { var builder = new ContainerBuilder(); builder.RegisterModule(); var container = builder.Build(); ILogger logger = container.Resolve(); ServiceRuntime.RegisterServiceAsync(“MyService”, (context) => new MyService(context, logger)).GetAwaiter().GetResult(); } 在没有将IContainer传递给StatefulService构造函数的情况下,我不知道如何将其用于Web API的Startup初始化以设置DependencyResolver。

Autofac,IDisposable和手动呼叫。在某些情况下解决

我在IDisposable对象和使用Autofac时发布了一般指南问题: dependency injection和IDisposable 。 不幸的是,我没有考虑到我们项目中的一个特定场景,它实际上是一个独立的问题,所以会在这里问: 我有一个Repository对象来管理其中的会话对象的生命周期。 因此,Repository对象是IDisposable并且销毁会话(Repository在构造时注入工厂委托,在第一次使用期间实例化会话,并且如果session不为null则在IDisposable中销毁会话)。 根据上面对StackOverflow问题的引用,我理解注入了我的Repository对象的任何对象都不应该实现IDisposable,因为Autofac会处理我的存储库,如果它正在注入它们。 每个提到的StackOverflow线程,我已经开始清理我的对象中的IDisposable用法,直到我偶然发现下面显示的NotificationPublisher类。 有一些地方喜欢它的类注入了IComponentContext的实现作为工厂。 解析在函数中手动执行,因为代码库不知道在运行时之前需要注入哪个处理程序。 public class NotificationPublisher : INotificationPublisher { private readonly IComponentContext _container; private readonly INotificationManager _notificationManager; public NotificationPublisher(IComponentContext container, INotificationManager notificationManager) { _container = container; _notificationManager = notificationManager; } public IEnumerable Publish(Account account, INotificationInitiator owner, INotificationEntity entity, Int32 severity, CheckCycleContext monitoringContext) { var alertSubscriptions = _notificationManager.GetAlertSubscriptions(account, […]

如何使用AutoFac解析正确的记录器类型?

我正在更新使用AutoFac的遗留项目,我想将NLog与简单记录外观(SLF)一起使用 我以前在Ninject中使用过它,设置起来非常简单,我只需要做类似的事情: kernel.Bind().ToMethod(x => LoggerFactory.GetLogger(x.Request.Target.Member.ReflectedType)); 输出将是这样的: NLogNinjectSlf.Services.MyService 2013-12-30 15:21:10.5782 DEBUG日志从注入的Logger 小菜一碟 但现在我必须使用AutoFac,我不知道如何获得需要记录器的Target类型 例如,如果我有以下接口/类: public interface IMyService { void DoSomething(); } public class MyService : IMyService { private readonly ILogger _logger; public MyService(ILogger logger) { _logger = logger; } public void DoSomething() { _logger.Debug(“Log from injected Logger”); } } 我希望能够获得MyService类的类型,将其用作记录器的名称 在AutoFac中,这是我到目前为止所尝试的: var containerBuilder = new ContainerBuilder(); […]

解决单身人士的Autofac会造成瓶颈

我在asp.net MVC应用程序中使用Autofac并遇到了锁定问题。 只要服务依赖于单例,该服务就会从根生存期范围中解析出来。 这是因为Autofac: 从根范围解析单例组件 从根作用域解析具有必须从root解析的依赖项的任何组件。 此外,当从任何范围解析时,Autofac会锁定该范围。 我认为这些都是很好的设计决策。 我的问题是行为不端的阶级,他们依赖单身人士并且建设者很慢。 这些为任何需要解决单身人士的人造成了瓶颈。 由于这是在MVC应用程序中,每个请求都会映射到构造函数注入的某个MVC控制器。 此外,我的大多数控制器都依赖于各种单例服务(日志记录,缓存等)。 对于具有快速构造函数的东西,这不是问题。 但是,只要请求一个写得不好的类,我的吞吐量就会因为每个新请求都被阻塞在那个行为不当的构造函数上。 例如: 鉴于这3个class级 //registered as SingleInstance() class MySingleton {} class BadTransient { public BadTransient(MySingleton s) { Thread.Sleep(5000); } } class FriendlyTransient {} 解决了 using(var scope = container.BeginLifetimeScope(“nested scope”)) { //resolves from child scope var myFriend = scope.Resolve(); //resolves from root because it’s […]

如何在使用Autofac WcfIntegration时处理构造函数exception

有没有办法处理WCF服务的构造函数抛出的exception,当该构造函数接受依赖项时, 它是IoC容器(在本例中为AutoFac)导致exception的依赖实例化 ? 考虑具有以下构造函数的WCF服务: public InformationService(IInformationRetriever informationRetriever) { _informationRetriever = informationRetriever; } //… the service later makes use of the injected InformationRetriever 该服务使用AutoFac WcfIntegration和AutofacWebServiceHostFactory (这恰好是一个RESTful服务)。 依赖关系在服务的global.asax.cs中注册,即: builder.RegisterType() .As() 现在, InformationRetriever实现在其构造函数中执行一些检查,以确保一切就绪,以便能够完成其工作。 当它在此阶段发现问题时,它会抛出exception。 但是,我不希望服务的调用者接收AutoFacexception: An exception was thrown while invoking the constructor … on type InformationRetriever 我有效地试图测试: 鉴于 InformationService正在运行 当我调用GetSomeInformation()方法时 并且无法实例化InformationRetriever 然后我想返回一个友好的错误消息 并记录实际的exception 这是我的设计问题,还是有一个已知的模式来克服或防止这个问题? 我一直在寻找,无法找到有关此类问题的任何信息。

Autofac。 如何使用自定义方法(属性)来解决一些接口?

我有以下接口: public interface IConfigurationProvider where TSettings : ISettings, new() { TSettings Settings { get; } } public interface ISettings { } 我有以下IConfigurationProvider实现: public class ConfigurationProvider : IConfigurationProvider where TSettings : ISettings, new() { public ConfigurationProvider() { this.BuildConfiguration(); } public TSettings Settings { get; private set; } private void BuildConfiguration() { this.Settings = new TSettings(); //…load […]

插件架构中的DI(Autofac):每个插件有一个单独的DI容器吗?

我试图将DI(使用Autofac )引入现有的Windows窗体应用程序。 此应用程序具有基本的插件体系结构,其中每个插件都显示其自己的表单。 在启动时,应用程序扫描已注册的程序集以查找实现IPlugin类型,然后使用Activator.CreateInstance激活它们: public interface IPlugin { Form MainForm { get; } } 我不能改变这个给定的框架。 这意味着,每个插件类都是通过非DI方式实例化的,在我看来,因此我必须为每个插件引导一个单独的DI容器。 我的问题是 ,每个插件创建一个单独的ContainerBuilder和容器OK还是合理有效吗? (将有大约10种不同的插件。)或者整个应用程序应该只有一个DI容器? 我在下面提供了一些当前解决方案的示例代码。 using Autofac; using System.Windows.Forms; public class Plugin : IPlugin // instantiated by Activator { public Form MainForm { get; private set; } public Plugin() // parameter-less constructor required by plugin framework { var builder = […]