【问题标题】:Using two Simple Injector container instances with different lifestyles in c#在 c# 中使用两个具有不同生活方式的 Simple Injector 容器实例
【发布时间】:2018-03-09 18:39:08
【问题描述】:

我在 Global.asax 中有一个 Web 表单应用程序,我正在构建如下所示的 Simple Injector 容器。我做两个的原因是因为我正在使用 Hangfire 来安排重复性工作,并且它没有采用我目前对应用程序拥有的 Scoped 生活方式,因为它作为后台工作线程运行。当我为我的 EF 实体创建容器的两个实例时,出现以下错误。

无法定义两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象上

谁能告诉我如何在我的网络表单应用程序中注册两个具有不同生活方式的容器。

ContainerConfig.BuildContainer();
var container = ContainerConfig.BuildContainerJobs();

public static Container BuildContainer()
{
    var container = new Container();
    container.Options.DefaultScopedLifestyle = new ExecutionContextScopeLifestyle();
    container.Register<TraceTimer>(Lifestyle.Scoped);
    container.Register<Entities>(() => new Entities(), Lifestyle.Scoped);
    container.Register<ReferenceDataCache>(
        () => ReferenceDataCacheFactory.Create(), Lifestyle.Scoped);

    var adapter = new SimpleInjectorAdapter(container);
    ServiceLocator.SetLocatorProvider(() => (IServiceLocator)adapter);
    ExecutionContextScopeManager.Current = (IExecutionContextScopeManager)adapter;
    return container;
}

public static Container BuildContainerJobs()
{
    var container = new Container();
    container.Options.DefaultScopedLifestyle = new ExecutionContextScopeLifestyle();

    container.Register<Entities>(() => new Entities(), Lifestyle.Transient);
    container.Register<ReferenceDataCache>(
        () => ReferenceDataCacheFactory.Create(), Lifestyle.Transient);

    var adapter = new SimpleInjectorAdapter(container);
    ServiceLocator.SetLocatorProvider(() => (IServiceLocator)adapter);
    ExecutionContextScopeManager.Current = (IExecutionContextScopeManager)adapter;
    return container;
}

Global.asax 注册码

ContainerConfig.BuildContainer();
var container = ContainerConfig.BuildContainerJobs();
var options = new SqlServerStorageOptions
{
    QueuePollInterval = TimeSpan.FromMinutes(5) // Default value
};
GlobalConfiguration.Configuration
   .UseSqlServerStorage("Jobs",options);
GlobalConfiguration.Configuration.UseDefaultActivator();

GlobalConfiguration.Configuration.UseActivator(new SimpleInjectorJobActivator(container));
GlobalJobFilters.Filters.Add(new SimpleInjectorAsyncScopeFilterAttribute(container));
JobsHelper.SetRecurringJob();
_backgroundJobServer = new BackgroundJobServer();

【问题讨论】:

  • 请包含异常的完整堆栈跟踪。

标签: c# entity-framework simple-injector hangfire


【解决方案1】:

这个异常不是简单注入器抛出的,而是实体框架抛出的。此异常通常是由使用在 另一个 DbContext 中使用一个 DbContext 创建的实体实例引起的。

很遗憾,我无法更具体地指出您出错的地方以及如何解决此问题,因为您的问题不包含适当的详细信息。

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 2017-08-16
    • 2018-08-29
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多