Tag: autofac

是否可以在AutoFac中获取容器类型

例如,我在System.Type类型的构造函数中使用一个参数注册了类C1。 我有另一个类(C2),注入参数类型为C1。 我想在C1构造函数中自动接收typeof(C2) 。 有可能吗? 示例代码: public class C1 { public C1(Type type) {} // … } public class C2 { public C2(C1 c1) {} // … } // Registration containerBuilder.Register(???); containerBuilder.Register();

使用Autofac将log4net注入控制器

尝试使用Autofac将log4net类注入我的控制器,但是我得到以下exception: 可以使用可用的服务和参数调用在’MvcApplication6.Controllers.HomeController’类型上找到’公共绑定标志’的构造函数:无法解析构造函数’void .ctor(log4net.ILog)的参数’log4net.ILog logger’ ”。 我创建了一个模块,使用正确的类型注入Log类: public class LogInjectionModule : Module { protected override void AttachToComponentRegistration(IComponentRegistry registry, IComponentRegistration registration) { registration.Preparing += OnComponentPreparing; } 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 == typeof(ILog), (p, i) => LogManager.GetLogger(t)) }); } } 然后我在我的ASP.NET MVC […]

无需创建对象即可解析类型

这是我的问题:我有一个容器,我将具体类型注册为接口。 builder.RegisterType().As(); 我正在为我正在进行的序列化项目实现SerializationBinder ,我需要实现的BindToType方法要求我返回一个Type对象。 BindToType方法为我提供了一个assemblyName和typeName (两个字符串)来帮助我创建一个类型对象。 我想要做的是,如果typeName是一个接口,我想问一下Autofac具体的实现Type是什么Type接口Type而不实际创建对象。 那可能吗?

MVC 4 Autofac和Generic Repository模式

我正在使用我的MVC 4应用程序中的工作单元和通用存储库模式。 我试图解决的问题是为我系统中的每个实体创建Repository存根。 为了利用Autofac Ioc,我必须为每个实体创建一个存储库类和接口,以便我可以在Autofac中注册它。 应用开始…… builder.RegisterType().As().InstancePerHttpRequest(); 存储库类 public class SchoolDetailRepository : RepositoryBase, ISchoolDetailRepository { public SchoolDetailRepository(IDatabaseFactory databaseFactory) : base(databaseFactory) { } } 接口 public interface ISchoolDetailRepository : IRepository { } 这似乎是一项额外的工作。 有没有办法注册Type的通用存储库而不是创建所有这些空类? 然后在我的服务类中,我可以通过Ioc将通用类型传递给构造函数,例如… public class SchoolService : ISchoolService { private readonly IRepository _schoolRepository; private readonly IUnitOfWork _unitOfWork; public SchoolService(IRepository schoolRepository, IUnitOfWork unitOfWork) { this._schoolRepository […]

autofac中的条件组件注册

是否可以有条件地在其他组件的状态上注册组件? 就像是: ContainerBuilder.RegisterConditionally( Func, Func); 我发现在autofac的V2之前,可以使用“ Register().OnlyIf() ”构造,它看起来像我正在寻找的那个。 我希望此function有条件地覆盖默认注册。 class CommonRegistrations { public virtual void Register(ContainderBuilder builder) { builder.Register(ctx => LoadSettings()).As().SingleInstance(); builder.RegisterType().As(); } } class SpecificRegistrations : CommonRegistrations { public virtual void Register(ContainerBuilder builder) { base.Register(builder); builder.ConditionalyRegister( ctx => ctx.Resolve().ReallyUseSpecificFoo, ctx => new SpecificFoo()).As(); } } … var builder = new ContainerBuilder(); var registrations = […]

如何在UWP应用程序中使用autofac?

我在UWP应用程序中使用autofac。 在我的App实例中,我正在设置依赖项,如下所示: public sealed partial class App { private readonly IFacade m_facade; public App() { InitializeComponent(); m_facade = InitializeDependencies(); Suspending += OnSuspending; } private IFacade InitializeDependencies() { var containerBuilder = new ContainerBuilder(); // Registers all the platform-specific implementations of services. containerBuilder.RegisterType() .As() .SingleInstance(); containerBuilder.RegisterType() .As() .SingleInstance(); containerBuilder.RegisterType() .As() .SingleInstance(); … containerBuilder.RegisterType() .As(); // Auto-magically resolves […]

具有相同接口的多个实现的Autofac

我正在使用Autofac,并希望有多个接口实现。 如何配置Autofac以便根据当前类型解析依赖关系? 更具体地说,我有一个接口和多个应该链接在一起的实现。 让我解释一下(虚拟课程): public interface IMessageHandler { void Handle(Message message); } public class LoggingMessageHandler : IMessageHandler { private IMessageHandler _messageHandler; public LoggingMessageHandler(IMessageHandler messageHandler) { _messageHandler = messageHandler; } public void Handle(Message message) { // log something _messageHandler.Handle(message); } } public class DoSomethingMessageHandler : IMessageHandler { private IMessageHandler _messageHandler; public DoSomethingMessageHandler (IMessageHandler messageHandler) { _messageHandler […]

如何在Autofac中注册许多开放式通用

我是Autofac的新手 (不是DI )。 情况如下: 我有这些接口: public interface IQuery : IQuery { } public interface IQueryHandler where TQuery : IQuery { TResult Handle(TQuery query); } 在我的解决方案中有很多实现: class GetPersonQuery : IQuery { } class GetPersonQueryHandler : IQueryHandler { } class GetArticleQuery : IQuery { } class GetArticleQueryHandler : IQueryHandler { } class GetSomethingQuery : IQuery<IEnumerable> { } […]

JavaScript DI / IoC等同于静态类型语言的标准DI模式

.NET和Java都有大量的DI / IoC容器可供它们使用,每个容器都有许多模式,我发现这些模式在处理它们的各个方面非常有用。 我现在正想在JavaScript中做同等的事情。 由于JavaScript是一种动态语言,我不希望DI / IoC容器直接等同于静态类型语言中容器提供的所有function,因此欢迎使用这些模式的替代方案。 我还希望JavaScript中提供的DI / IoC容器的function会有所不同,因此对不同容器的引用非常受欢迎。 以下模式是Autofac 3支持的模式 ,我认为这些模式适用于动态语言。 有关这些模式和关系的一般信息,请参阅http://autofac.readthedocs.org/en/latest/resolve/relationships.html和http://nblumhardt.com/2010/01/the-relationship-zoo/ 。 以下概念中的大多数(如果不是全部)也可以使用其他语言和DI / IoC容器,例如Google Guice和Spring 。 与JavaScript中下面描述的概念和模式最接近的等价物是什么? 一般概念 概念1:向IoC容器注册 在IoC容器可以创建类型的实例之前,它需要知道类型。 这是通过注册完成的。 注册通常以声明方式完成: class A {} var builder = new ContainerBuilder(); builder.RegisterType(); 上面使IoC容器知道类型A.它通过reflection发现A的依赖性。 注册也可以通过充当工厂的function进行。 这些函数通常是lambdas,可以内联编写: class B {} class A { A(string name, B b) { } } builder.RegisterType(); builder.Register(c => // […]

Autofac RegisterInstance与SingleInstance

IProductRepositoryProxy ProductDataServiceProviderInstance = new ServiceProductDataProvider(); builder.RegisterInstance(ProductDataServiceProviderInstance).As(); VS builder.RegisterType().As().InstancePerRequest(); 我在这里看到了前雇员的代码,并想知道这个人是否想要注册一个.SingleInstance()行为。 builder.RegisterType().As().SingleInstance(); 使用RegisterInstance的ServiceProductDataProvider的手动新增与Register .SingleInstance()不同吗?