我的申请结构如下:
Web服务器使用Web Api Http请求从客户端收到,转到AppCoreLayer(Singleton)并从那里发送到DAL,它首先使用EF代码。
此外,在逻辑层和外部应用程序之间建立了Tcp连接。
在我的DAL中,我使用DbContext,我在我的DI容器(Autofac)中注册为PerRequest。
我的问题是我很快就会收到来自外部应用程序的消息,并且需要执行一些数据库操作,但是我无法理解如何以这种方式实例化DbContext。
我已经阅读了注册对象PerMatchingLifetimeScope帮助不支持请求的外部应用程序,但我不明白是否以及如何帮助我。会喜欢解释。
由于
答案 0 :(得分:0)
在默认关系中,AppCoreLayer需要DbContext。但在你的情况下,AppCoreLayer需要创建DbContext。您可以使用Dynamic Instantiation轻松完成此操作。
使用自动生成的工厂可以让您有效地打电话 Resolve()而不将组件绑定到Autofac。用这个 关系类型,如果您需要创建一个以上的实例 给定服务,或者如果您不确定是否需要服务 并希望在运行时做出决定。
但是如果您的DbContext
注册为InstancePerRequest
,您应该自己解决DbContext。因为单例对象在根生命周期范围内被解析,但是每个请求都有不同的生命周期镜。
因此,您可以使用ILifeTimeScope
或DependencyResolver
来解析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。