Autofac解析单例对象

时间:2016-02-16 06:05:40

标签: c# entity-framework dependency-injection autofac

我的申请结构如下:

Web服务器使用Web Api Http请求从客户端收到,转到AppCoreLayer(Singleton)并从那里发送到DAL,它首先使用EF代码。

此外,在逻辑层和外部应用程序之间建立了Tcp连接。

在我的DAL中,我使用DbContext,我在我的DI容器(Autofac)中注册为PerRequest。

我的问题是我很快就会收到来自外部应用程序的消息,并且需要执行一些数据库操作,但是我无法理解如何以这种方式实例化DbContext。

我已经阅读了注册对象PerMatchingLifetimeScope帮助不支持请求的外部应用程序,但我不明白是否以及如何帮助我。会喜欢解释。

由于

1 个答案:

答案 0 :(得分:0)

在默认关系中,AppCoreLayer需要DbContext。但在你的情况下,AppCoreLayer需要创建DbContext。您可以使用Dynamic Instantiation轻松完成此操作。

  

使用自动生成的工厂可以让您有效地打电话   Resolve()而不将组件绑定到Autofac。用这个   关系类型,如果您需要创建一个以上的实例   给定服务,或者如果您不确定是否需要服务   并希望在运行时做出决定。

但是如果您的DbContext注册为InstancePerRequest,您应该自己解决DbContext。因为单例对象在根生命周期范围内被解析,但是每个请求都有不同的生命周期镜。

因此,您可以使用ILifeTimeScopeDependencyResolver来解析DbContext。这是一个例子:

        public Func<T> HttpRequestScopedFactoryFor<T>()
        {
            return () => DependencyResolver.Current.GetService<T>();
        }

        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterType(typeof(DerivedDbContext)).AsSelf().InstancePerRequest();
            builder.RegisterInstance(HttpRequestScopedFactoryFor<DerivedDbContext>());
        }

同时检查this