Tag: autofac

在Autofac中注册异步工厂

我有一个从存储库中获取的Wallet类。 我正在尝试在Autofac中正确注册,因此使用钱包的类可以注入适当的实例。 问题是存储库使用异步方法(返回Task)。 Autofac是否支持此类案例? 这不起作用: cb.RegisterType() .As() .SingleInstance(); cb.Register(async c => await c.Resolve().CreateAsync(App.WalletPath)); cb.RegisterType() .AsSelf(). .SingleInstance(); 在应用程序的某个地方我只有: class ViewModel { public ViewModel(Wallet wallet) { //nothing fancy here } } 当调用container.Resolve()我得到一个例外,说钱包没有注册。

Autofac – 动态解析带参数的组件

我有一个类接口作为构造函数参数。 这个接口有两个实现,我想根据变量决定在运行时使用什么实现。 问题是上面的类深入到了由Autofac解析的对象层次结构中,所以我无法传入参数。 像下面这样的Somehing就是我想要实现的目标。 public interface IInterface1 {} public interface IInterface2 {} public class Class1 : IInterface2 { public Class1(IInterface1 interface1) { } } public class Class2 { public Class2(IInterface2 interface2) { } } public class Class3 { public void GetClass2Instance(string interface1ImplementationToChoose) { // want to change which implementation of IInterface1 is resolved based on […]

使用带有SignalR的Autofac时的范围错误

我正在尝试在SignalR中心注入一个HttpContextBase : public class EventHub : Hub, IDisconnect { private readonly HttpContextBase _httpContextBase; public EventHub(HttpContextBase httpContextBase) { _httpContextBase = httpContextBase; } […] } 注册码如下所示: private static void InitAutofac() { var builder = new ContainerBuilder(); var assembly = typeof (MvcApplication).Assembly; builder.RegisterControllers(assembly).PropertiesAutowired(); builder.RegisterModule(new AutofacWebTypesModule()); builder.RegisterFilterProvider(); builder.RegisterAssemblyTypes(assembly) .Where(InterfaceBasedInjectedClasses()) .AsImplementedInterfaces() .InstancePerLifetimeScope(); builder.RegisterAssemblyTypes(assembly) .Where(InterfaceLessInjectedClasses()) .InstancePerLifetimeScope(); builder.RegisterType().InstancePerLifetimeScope(); builder.RegisterType().InstancePerLifetimeScope(); var container = […]

仅仅为Owned 在我的项目中引用Autofac是不好的设计?

我最近成为了Autofac的OwnedInstancesfunction的重要用户。 例如,我用它来提供一个工厂来为我的数据库创建一个工作单元,这意味着我依赖于UnitOfWork工厂的类要求类型的对象: Func<Owned> 这非常有用 – 非常适合将IDisposable保留在我的界面之外 – 但它需要付出代价:因为Owned 是Autofac程序集的一部分,我必须在我知道Owned 的每个项目中引用Autofac。 ,并在每个代码文件中添加“使用Autofac.Features.OwnedInstances”。 Func 具有内置于.NET框架的巨大好处,因此我毫不怀疑将Func用作通用工厂包装器是可以的。 但是Owned 在Autofac程序集中,每次我使用它时,我都会创建一个对Autofac的硬引用(即使我在接口方法参数中对Autofac的唯一引用是Owned 类型)。 我的问题是:这是件坏事吗? 这会开始以某种方式让我回头,我还没有考虑到这一点吗? 有时我会有一个由许多其他项目引用的项目,因此我自然需要将其依赖关系尽可能接近零; 我是通过将Func >(实际上是数据库事务提供程序)传递给这些接口中的方法(否则将是autofac-nonnostic)来做恶的? 也许如果Owned 是一个内置的.NET类型,这整个困境会消失吗? (我是否应该屏住呼吸?)

WebApi,Autofac,System.Web.Http.Filters.ActionFilterAttribute每个请求的实例

我们已经在我们的应用程序(现在的MVC 4)中使用了Autofac很长一段时间,我们在基本控制器上有很多属性,一切都是inheritance的,并且一切正常,所以当请求开始时我们的服务被创建然后通过所有属性和控制器操作。 我们现在正在查看WebApi并创建了我们的WebApi控制器,并使用HTTP命名空间中的ActionFilterAttribute在基本控制器上创建了一个属性。 但是问题从这里开始,在属性上的属性上注入的服务与ApiController上的服务不同。 查看下面的链接,这似乎是已知的ASP.NET Web API和请求范围中的依赖项 然而,这里的解决方案并不理想,因为我们不希望我们的控制器知道dependency injection,我们只想使用我们注入属性的服务并知道它是每个请求一个实例。 我们称之为: builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); 和 GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); 我们的课程目前在Autofac注册为InstancePerLifetimeScope,我们想要的是能够为MvcControllers和ApiControllers提供每个请求。 那可能吗? 编辑: 所以基本上这行为请求返回正确的服务(即同样在ApiController上的实例) var service = actionContext.Request.GetDependencyScope().GetService(typeof(IOurService); 但是ActionFilterAttribute上的属性注入实例是不一样的,如果我将Autofac注册更改为InstancePerApiRequest,我会收到以下错误: “从请求实例的范围中看不到具有匹配’AutofacWebRequest’的标记的范围。这通常表示SingleInstance()组件(或类似方案)正在请求按HTTP请求注册的组件。在Web集成下,总是从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖,永远不要从容器本身请求。“

使用插件覆盖autofac注册

我有一个由DefaultFoo实现的IFoo服务,我已经在我的autofac容器中注册了它。 现在我想允许在插件程序集中实现IFoo的替代实现,可以将其放在“plugins”文件夹中。 如果存在,如何配置autofac以优先选择此替代实现?

如何使用autofac注册两个WCF服务合同

我有一个WCF服务,实现了两个服务合同…… public class MyService : IService1, IService2 我自我托管服务…… host = new ServiceHost(typeof(MyService)); 当服务只实现一个服务合同时,一切都工作正常,但是当我尝试设置autofac来注册这两个时: host.AddDependencyInjectionBehavior(_container); host.AddDependencyInjectionBehavior(_container); …它在第二个引发exception,报告: 该值无法添加到集合中,因为该集合已包含相同类型的项:’Autofac.Integration.Wcf.AutofacDependencyInjectionServiceBehavior’。 此集合仅支持每种类型的一个实例。 乍一看,我认为这是说我的两个合同在某种程度上被视为相同的类型,但在二读时我相信它是说AutofacDependencyInjectionServiceBehavior是有问题的类型,即我不能使用它两次! 然而,我发现这篇文章明确显示多次使用它的forms略有不同: foreach (var endpoint in host.Description.Endpoints) { var contract = endpoint.Contract; Type t = contract.ContractType; host.AddDependencyInjectionBehavior(t, container); } 不幸的是,这给出了同样的错误信息。 是否可以在一项服务上注册多个服务合同,如果是,如何?

在MVC中使用DI时的大规模控制器构造函数参数列表

我正在使用ASP.NET MVC3解决方案,该解决方案使用dependency injection与autofac。 我们的控制器是由autofac正确创建的,所有必需的对象都被正确传入。这些对象通常包括将域对象转换为MVC(视图)模型的服务,存储库和映射器。 所以控制器构造函数看起来有点像: public abcController( ILogger logger, IabcRepository abcRepository, IabcService abcService, IMapper abcMapper, … ) 不幸的是,随着时间的推移,这些构造函数参数列表往往会很快增长。 我们的一些控制器现在需要60个或更多参数。 我们在这里创造了一些反模式吗? 编辑 我应该提到我们试图遵循薄的控制器模式。 此外,大多数参数往往是映射器 – 大约66%。 控制方法通常非常简单,并遵循以下模式: 基于参数调用适当的服务或存储库 使用mapper将结果转换为适当的视图模型 传递视图模型进行查看 或者这种模式: 从后期行动中接收模型 使用mapper将其转换为适当的域对象 使用域对象调用适当的服务或存储库

每个匹配生命周期范围的实例,默认情况下?

我想在Autofac中为每个匹配的生命周期范围注册创建一个实例,但偶尔需要从全局容器(没有匹配的生命周期范围)请求实例。 在没有匹配的生命周期范围的情况下,我想提供一个顶级实例而不是抛出exception。 这可能吗?

如何使用Autofac来解析Nancy创建的子生命周期范围中的类型的每个请求依赖项的实例

我们在Windows服务中托管了多个应用程序,这些应用程序自我托管Nancy端点,以便公开有关应用程序操作的检测。 我们使用Autofac作为我们的IOC。 几个存储库在所有应用程序共享的核心DLL中注册到根容器中; 然后使用从Nancy.Autofac.Bootstrapper派生的引导程序将此容器作为其容器传递给Nancy。 我们发现,当Nancy收到Web请求时,它会从根容器中解析对存储库的请求,这会导致内存被非垃圾收集的IDisposable消耗,因为根容器不会超出范围(它有Windows服务的生命周期)。 这导致服务“泄漏”内存。 然后,我们切换到一个模型,在我们的南希引导程序中,我们使用InstancePerRequest在重写的ConfigureRequestContainer()方法中添加了存储库的注册: protected override void ConfigureRequestContainer(ILifetimeScope container, NancyContext context) { base.ConfigureRequestContainer(container, context); PerRequestContainerBuilder().Update(container.ComponentRegistry); } private static ContainerBuilder PerRequestContainerBuilder() { var builder = new ContainerBuilder(); // Dependency for repository builder.RegisterType().InstancePerRequest().As(); // Repository builder.RegisterType().InstancePerRequest().As(); return builder; } 我们还重写CreateRequestContainer()方法以使用标记MatchingScopeLifetimeTags.RequestLifetimeScopeTag创建请求容器。 protected override ILifetimeScope CreateRequestContainer(NancyContext context) { return ApplicationContainer.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag); } 这似乎解决了IDisposable没有被处理的问题 – 子请求容器被放置在Web请求管道的末尾,并且由它解析的对象也被处理并最终被垃圾收集。 我们的问题是,这似乎是将存储库的实现细节泄漏到服务中,因为我们不仅要在ConfigureRequestContainer()注册存储库,还要注册存储库所需的任何其他对象,即如果我们想要更改实现我们必须“遍历依赖链”以使用它在每个服务中注册所需的对象 – […]