Tag: autofac

是否可以从Autofac容器构建器中删除现有注册?

这些方面的东西: builder.RegisterType().As(); builder.RegisterType().As(); builder.DeRegisterType().As() var container = builder.Build(); var types = container.Resolve<IEnumerable>(); Assert.IsTrue(types.Count == 1); Assert.IsTrue(types[0].GetType == typeof(MyType2)); 场景:我经历了一堆程序集,当我注册类型时,我想确保我只有一个给定类型的实现。 我需要在创建容器之前执行此操作。 我可以自己跟踪,但如果Autofac可以帮助我,那将会很好。

使用Autofac作为服务定位器

我正在使用Autofac来处理我的应用程序中的dependency injection。 但是,我有一个组件在运行时执行一些reflection魔法,我不知道它在编译时需要什么依赖项。 通常,我只是让这个组件直接引用Container并解决它想要的任何东西。 但是,实例化此类的类没有对Container的引用。 实际上,我的组件依赖于Autofac。 我更喜欢松散耦合,但这似乎不是一个选择。 有没有办法要求(在构造函数args中,或使用属性注入,或者其他什么!)Autofac给我一个对我的构造函数中的容器的引用? 或者,是否有更简洁的方法让Autofac为我提供可以解决任何问题的魔术服务定位器对象?

AutoFac – 为一些开放的Generic注册装饰器

我正在尝试设置一个似乎有复杂要求的Autofac模块。 开始: 我有一个通用的界面: public interface IMyInterface 我有一堆实现此接口的类 例如 class MyImpl1 : IMyInterface { } class MyImpl2 : IMyInterface { } class MyImpl3 : IMyInterface { } 最后,我有一个装饰者: class MyDecorator : IMyInterface 我只想“装饰”具有特定属性的( MyInterface )实现。 所以具有[MyAttribute]属性的MyInterface的所有实现都使用MyDecorator进行修饰。 我很近但没有雪茄: var builder = new ContainerBuilder(); builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()) .Where(type => type.GetCustomAttributes(true) .Any(attr => attr.GetType() == typeof(MyAttribute))) .AsClosedTypesOf(typeof (IMyInterface)) .Keyed(“CachableQueries”, typeof(IMyInterface)); builder.RegisterGenericDecorator(typeof(MyDecorator), […]

Autofac将参数传递给嵌套类型

我在我的WCF服务中使用Autofac作为我的IoC。 我有一种情况,我想将一个对象传递给嵌套类型(即一种未直接解析的类型,但在解析另一种类型时)。 据我所知,将此对象作为构造函数参数传递是Autofac中的首选方法。 以下是这种情况的一个例子。 嵌套类型: public class EventLogger : IEventLogger { public EventLogger(IRepository repository, User currentUser) { … } } 我实际上试图解决的类型: public class SomeBusinessObject { public SomeBusinessObject(IEventLogger logger, …) { … } } 注册: var builder = new ContainerBuilder(); builder.RegisterGeneric(typeof(Repository)).As(typeof(IRepository)); builder.RegisterGeneric(typeof(EventLogger)).As(typeof(IEventLogger)); builder.RegisterType(); 解析我的WCF服务操作: var currentUser = GetUserFromServiceContext(); var bo = lifetimeScope.Resolve(); 我应该如何以及在何处将当前用户传递给我的记录器? 我是否应该假设WCF操作必须知道解析SomeBusinessObject需要首先解析IEventLogger并在解析SomeBusinessObject时传递已解析的实例? 这样的事情(原谅我,如果这不起作用,这只是一个想法): var […]

如何使AutoFac对每个顶级对象使用相同的嵌套依赖实例? (每个集线器的SignalRdependency injection)

我试图以这种测试通过的方式设置我的AutoFac注册: [Test] public void Autofac_registration_test() { // Given var builder = new ContainerBuilder(); RegisterServices(builder); var container = builder.Build(); // When var firstHub = container.Resolve(); var secondHub = container.Resolve(); // Then firstHub.Should().NotBe(secondHub); firstHub.FooRepo.Context.Should().Be(firstHub.BarRepo.Context); firstHub.FooRepo.Context.Should().NotBe(secondHub.FooRepo.Context); } 即我想在单个Hub一直使用相同的Context对象,但在创建新Hub时使用不同的Context对象。 RegisterServices目前只是: private void RegisterServices(ContainerBuilder builder) { builder.RegisterType(); builder.RegisterType(); builder.RegisterType(); builder.RegisterType(); // How should I scope this? } 哪个在firstHub.FooRepo.Context.Should().Be(firstHub.BarRepo.Context);失败了firstHub.FooRepo.Context.Should().Be(firstHub.BarRepo.Context); 因为Context是临时范围的。 但是每个生命周期的范围上下文也会失败,这次是在firstHub.FooRepo.Context.Should().NotBe(secondHub.FooRepo.Context); […]

Autofac属性注入在属性上失败

我已经找到了一些问题,但是他们倾向于指出我正在遵循的确切文档……但它仍然没有用。 我正在构建一个相当简单的ASP.NET MVC 4站点,计划是使用基于ActionFilterAttribute的日志记录。 我有一个DataAccessProvider类,它打开与数据库的事务并提供工作单元实例,我试图将它注入filter属性。 文档说只需调用RegisterFilterProvider()就足够了,并确保注册相关类型。 它特别说没有必要注册属性,但我已经尝试了有无。 我的代码目前看起来像这样: var builder = new ContainerBuilder(); builder.RegisterControllers(Assembly.GetExecutingAssembly()); builder.Register(x => new EntityAccessProvider()) .As() .InstancePerHttpRequest(); builder.RegisterType().PropertiesAutowired(); // ^ I’ve tried it with and without this line builder.RegisterFilterProvider(); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 然后,文档中的示例只是在filter上放置一个属性,所以我做了同样的事情: public class DebugLogAttribute : ActionFilterAttribute { private IDataAccessProvider DataAccess { get; set; } public override void […]

从MVC的DependencyResolver过渡到AutofacWebApiDependencyResolver – 哪里是.Current?

我让AutoFac与MVC4一起正常工作。 我正在尝试过渡到Web API 2.这是我设置AutoFac所得到的: public class AutofacRegistrations { public static void RegisterAndSetResolver() { // Create the container builder. var containerBuilder = new ContainerBuilder(); // Register the Web API controllers. containerBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly()); // Only generate one SessionFactory ever because it is expensive. containerBuilder.Register(x => new NHibernateConfiguration().Configure().BuildSessionFactory()).SingleInstance(); // Everything else wants an instance of Session per HTTP request, […]

在asp.net mvc 3中管理每个会话和请求的AutoFac生存期范围

我想在Web应用程序中使用AutoFac。 我有根容器,每个会话一个子容器和每个请求的子容器。 我正在试图找出管理这些生命周期范围的最佳方法。 在Global.asax.cs中,我添加了以下内容: protected void Application_Start(object sender, EventArgs e) { var container = …; } protected void Session_Start(object sender, EventArgs e) { var sessionScope = container.BeginLifetimeScope(“session”); Session[“Autofac_LifetimeScope”] = sessionScope; } protected void Application_BeginRequest(object sender, EventArgs e) { var sessionScope = (ILifetimeScope) Session[“Autofac_LifetimeScope”]; var requestScope = sessionScope.BeginLifetimeScope(“httpRequest”); HttpContext.Current.Items[“Autofac_LifetimeScope”] = requestScope; } protected void Application_EndRequest(object sender, […]

如何将依赖项名称作为构造函数参数注入

使用Autofac,我可以使用以下代码注册一个类来解析使用属性注入的接口: builder.RegisterType() .As() .PropertiesAutowired() .InstancePerDependency(); 但是,我的Log4NetAdapter类有一个构造函数参数,需要调用类的名称。 这样,我可以根据调用类的名称记录事件。 public class Log4NetAdapter : ILogger { private readonly ILog _logger; public Log4NetAdapter(string logName) { _logger = LogManager.GetLogger(logName); } … } 如果每个依赖项都有自己的Log4NetAdapter实例,我怎样才能将typeof(dependency).Name的名称(即typeof(dependency).Name )注入到属性注入类的构造函数中?

Autofac运行时参数

我是autofac的新手,希望看到将运行时值传递给构造函数的最佳实践。 我已经阅读了一堆stackoverflow问题,但是没有一个完全充实。 我们应该使用代表,工厂来创建服务等。我知道传递容器并不是实现这一目标的最佳方法。 在我的特定情况下,我有一个访问多个依赖项的服务,比如日志记录,数据提供者等。除了传递的少量服务之外,我还需要捕获运行时参数,比如userid,password。 SomeService需要用户标识和密码,并在Web查看器执行特定操作时查找。 以下是我的问题,并强调了问题。 public class SomeService : ISomeService { private readonly IDataProvider _dataProvider; private readonly ILog _log; private readonly string _username; private readonly string _password; public SomeService(IDataProvider dataProvider, ILog log, string username, string password) { _dataProvider = dataProvider; _log = log; _username = username; _password = password; } } 数据提供者和日志在autofac中配置 builder.RegisterType().As() builder.RegisterType().As() […]