Tag: autofac

使用Autofac注册基类的实现,以通过IEnumerable传入

我有一个基类,以及一系列inheritance自此类的其他类: (请原谅过度使用的动物类比) 公共抽象类Animal {} 公共课狗:动物{} 公共类猫:动物{} 然后我有一个依赖于IEnumerable public class AnimalFeeder { private readonly IEnumerable _animals; public AnimalFeeder(IEnumerable animals ) { _animals = animals; } } 如果我手动做这样的事情: var animals = typeof(Animal).Assembly.GetTypes() .Where(x => x.IsSubclassOf(typeof(Animal))) .ToList(); 然后我可以看到这会让Dog和Cat回归 但是,当我尝试连接我的Autofac时: builder.RegisterAssemblyTypes(typeof(Animal).Assembly) .Where(t => t.IsSubclassOf(typeof(Animal))); builder.RegisterType(); 实例化AnimalFeeder ,没有Animal传入构造函数。 我错过了什么吗?

Autofac – 确保控制器具有无参数的公共构造函数

我知道之前已经被问过并回答了 – 我问的原因是因为(我认为)我尝试了所有建议的解决方案来解决这个问题,但仍无法解决问题。 我有一个ASP.NET Web API 2.0项目。 我安装了Autofac,Autofac.Mvc5和Autofac.WebApi2依赖项。 当我尝试调用API控制器时,我收到以下错误: 尝试创建“MyController”类型的控制器时发生错误。 确保控制器具有无参数的公共构造函数。 在我的Global.asax我调用了IocConfig.Config() ,它放在App_Start : public static class IocConfig { public static void Config() { var builder = new ContainerBuilder(); builder.RegisterType().As(); builder.RegisterApiControllers(Assembly.GetCallingAssembly()); builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); WebApiApplication.Container = builder.Build(); DependencyResolver.SetResolver( new AutofacDependencyResolver(WebApiApplication.Container)); GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(WebApiApplication.Container); } } 这是MyController的构造函数: public MyController(IMyLogger logger) 当我尝试调用它时,我得到有关构造函数的指定错误。 我错过了什么?

Autofac终身范围装饰器

我正在使用Autofac实现一个命令处理程序模式,并使用它的decorator工具处理交叉切割问题,如日志记录,身份validation等。 我还有依赖项,我只希望作用于请求/响应管道的生命周期。 我在下面有一个示例实现: public class Program { public static void Main() { var builder = new ContainerBuilder(); builder.RegisterAssemblyModules(typeof(HandlerModule).Assembly); builder.RegisterType().AsSelf() .InstancePerMatchingLifetimeScope(“pipline”); var container = builder.Build(); using(var scope = container.BeginLifetimeScope(“pipline”)) { var pingHandler = scope.Resolve<IHandle>(); pingHandler.Handle(new PingRequest()); } } } public class HandlerModule : Autofac.Module { protected override void Load(ContainerBuilder builder) { builder.RegisterAssemblyTypes(ThisAssembly) .As(type => type.GetInterfaces() .Where(interfaceType […]

Autofac范围问题

我想让autofac工作,但我的unitofwork /用户管理器类有问题。 最初我将我的工作单元设置为每个请求实例,如下所示: builder.RegisterType<UnitOfWork>().As().InstancePerRequest(); 但在我的StartupConfig.cs中,我试图像这样设置oAuth: private static OAuthAuthorizationServerOptions ConfigureOAuthTokenGeneration(IAppBuilder app, ILifetimeScope scope) { var t = scope.Resolve(); // Get our providers var authProvider = scope.Resolve(); var refreshTokenProvider = scope.Resolve(); // Create our OAuth options return new OAuthAuthorizationServerOptions() { AllowInsecureHttp = true, // TODO: Remove this line TokenEndpointPath = new PathString(“/oauth/access_token”), AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), AccessTokenFormat = […]

Autofac:如何加载引用但未直接使用的程序集

我们使用Autofac for DI创建了一个WebApi解决方案。 我们将autofac的引导分解为一个单独的项目。 这样,我们的WebApi项目仅引用我们的Bootstrap和Contracts项目。 然后我们的引导程序引用所有其他程序集并将所有内容连接在一起。 我喜欢这种设计用于分离关注点。 我们可以按如下方式手动加载我们的程序集 – 其中我们的“AutofacModule”类包含注册每个模块(程序集)的必要信息。 ContainerBuilder builder = new Autofac.ContainerBuilder(); builder.RegisterModule(new Business.AutofacModule()); builder.RegisterModule(new Data.AutofacModule()); builder.RegisterModule(new Services.AutofacModule()); etc… 这有效,但需要对每个程序集进行硬编码。 我们试图使这个动态化,以便我们可以循环遍历所有引用的程序集,如下所示。 var assemblies = BuildManager.GetReferencedAssemblies().Cast(); foreach (var assembly in assemblies) { builder.RegisterAssemblyModules(assembly); } 这应该有效,但不行。 问题是.Net确定在引导程序项目中实际上没有使用各种程序集而不加载它们(试图优化?)。 所以我们的一些程序集从未加载过。 我还尝试了以下循环bin目录来查找所有程序集。 但是,在编译期间,.Net不会将未引用的程序集移动到bin目录中,因此它们也不存在。 string assemblyPath = System.IO.Path.Combine( System.AppDomain.CurrentDomain.BaseDirectory, “bin”); var allAssemblies = new List(); foreach (string dll […]

注册没有特定构造函数签名的控制器时,已添加具有相同键的项

这真的很奇怪。 有一个使用Autofac 3.3的MVC 5应用程序,当我添加一个没有特定构造函数签名的新控制器时,抛出An item with the same key has already been added的An item with the same key has already been added错误。 我该如何调试呢? 如果构造函数如下所示,那么当我导航到该控制器的url时,它会加载正常: public class ProductController : Controller { private readonly IServiceManager _serviceManager; public ProductController(IServiceManager serviceManager) { _serviceManager = serviceManager; } } 但是如果我添加一个没有构造函数,无参数构造函数或其他各种签名的新控制器并导航到它爆炸的特定URL: public class QuestionController : Controller { // explodes public QuestionController() { […]

使用UsingConstructor注册RegisterAssemblyTypes

我想注册具有多个构造函数的程序集类型自动assembly选择错误的构造函数并希望像在RegisterType中那样指定它 builder.RegisterType(typeof(IController)) .UsingConstructor(typeof(IUnitOfWork)); 但是当我这样做的时候 builder.RegisterAssemblyTypes(typeof(IController).Assembly) .UsingConstructor(typeof(IUnitOfWork)); 我明白了 “类型’System.Object’上不存在匹配的构造函数。” 我认为这是因为assembly类型比我想象的要复杂一些,但问题仍然存在 我该怎么办?

使用WebApi和业务层进行Autofac

我是AutoFac的新手,我正在尝试将它用于我的新项目,包括WebApi和Business Layer以及合同及其各自的实现。 我已经编写了webapi的IocConfiguration并从global.asax调用。 但是,对于我的Business Logic,如何使用autofac设置所有合同和实现? 我确实在线阅读了一些教程但是我找不到任何有用的东西,如果有人有一个示例应用程序,链接真的有帮助。 编辑: AutoMapper个人资料。 public class CustomProfile : Profile { protected override void Configure() { CreateMap() .ForMember(d => d.Id, s => s.MapFrom(src => src.Id)); } } 编辑: 经过几个小时的花费,我想出了如何使用AutoFac设置AutoMapper 4.2.1。 显然我在AutoMapper 3.3.0中使用了ConfigurationStore,但是我升级到了4.2.1,配置文件注册发生了一些变化。 以下是对我有用的。 public class AutoMapperModule : Module { protected override void Load(ContainerBuilder builder) { Mapper.Initialize(cfg => { cfg.AddProfile(); cfg.AddProfile(); }); base.Load(builder); […]

UOW + Repository + Autofac加载两个不同的DbContext

我今天面临一个问题,我无法解决,我搜索了很多,无法解决问题,请尽可能帮助我。 我正在实现一个MVC应用程序,该应用程序使用EF +存储库模式+工作单元和Autofac作为dependency injection器。 我能够使用一个DbContext类,但我面临的情况是我需要使用另一个DbContext实例(使用其他用户凭据访问另一个数据库) 让我更好地解释一下:我有来自数据库A的EntityA(并且有一个DatabaseA_Context类)。 所以我需要一个EntityB,它来自数据库B(带有自己的DatabaseB_Context类)。 当我使用AutoFac注册它们时,只会在GenericRepository实现上注入最后配置的依赖项。 我已经发现文章说Autofac用最后一个值覆盖了注册。 我已经发现其他文章显示我是否在UnitOfWork构造函数上传递了IEnumerable,我能够看到它的所有注册类型,但我想要一个特定的类型。 我清楚了吗? 我的代码如下: 我的控制器: public class MyController : Controller { private readonly IBaseBLL _aBLL; private readonly IBaseBLL _bBll; public MyController(IBaseBLL aBLL, IBaseBLL bBLL) { _aBLL = aBLL; _bBLL = bBLL; } } 我的业务层 public interface IBaseBLL where T : class { T Select(Expression<Func> predicate); T AddT […]

如何在autofac中混合装饰器?

我希望能够将装饰器与Autofac混合搭配。 例如,假设我有一个由Repository类实现的IRepository接口。 我可以拥有以下装饰器:RepositoryLocalCache,RepositoryDistributedCache,RepositorySecurity,RepositoryLogging …,你得到了ideea。 基于配置设置,我想用所需的装饰器来装饰基本实现。 那可以是无,一个或多个装饰器。 我熟悉注册一个装饰器的语法,或者按固定顺序注册它们的链,但我怎样才能使这个动态化呢?