Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 多线程注册_.net_Ninject_Unity Container_Structuremap_Autofac - Fatal编程技术网

.net 多线程注册

.net 多线程注册,.net,ninject,unity-container,structuremap,autofac,.net,Ninject,Unity Container,Structuremap,Autofac,是否有任何.net IOC容器具有线程安全类型注册 我有许多绑定在应用程序的生命周期内都是固定的,但是有一些注册需要在“每个线程”或“每个请求”的基础上进行调整。当这个应用程序的线程被循环到线程池中/从线程池中回收时,少量的动态IOC注册将被清除或覆盖,因为新的请求被调度 为了澄清,下面是基于Unity的示例代码,它将WCF服务与容器“模块”或“注册表”的概念相结合 上述示例的关键部分是[ThreadStatic],它确保多个线程可以安全地调用WithConnection() 但这并没有改变我的

是否有任何.net IOC容器具有线程安全类型注册

我有许多绑定在应用程序的生命周期内都是固定的,但是有一些注册需要在“每个线程”或“每个请求”的基础上进行调整。当这个应用程序的线程被循环到线程池中/从线程池中回收时,少量的动态IOC注册将被清除或覆盖,因为新的请求被调度

为了澄清,下面是基于Unity的示例代码,它将WCF服务与容器“模块”或“注册表”的概念相结合

上述示例的关键部分是
[ThreadStatic]
,它确保多个线程可以安全地调用
WithConnection()

但这并没有改变我的问题——是否有一个.net容器具有线程安全注册

编辑:

自动传真具有该功能

所有容器操作都可以在多个线程之间安全使用

解析上下文对象是单线程的,不应在依赖项解析操作过程中使用

容器层次结构机制通过维护任何工厂/容器组件的组件注册的本地副本,进一步减少锁定。创建初始注册副本后,使用“内部”容器的线程可以创建或访问此类组件,而不会阻塞任何其他线程

您可以使用Autofac注册特定于某个线程的服务

线程安全类型 以下类型对于多线程并发访问是安全的:

容器

组件注册表

处理器(IDisposer的默认实现)

LifetimeScope(ILifetimeScope的默认实现)

这些类型几乎涵盖所有运行时/解析场景


ContainerBuilder专为配置时的单线程访问而设计

简单的注入器与Autofac一样具有安全性。但是如果您需要在多个线程上注册容器,那么您就做错了。如果您需要每个请求的生活方式,大多数框架都有特定的功能。考虑每个请求或每个工作单元有不同的生命周期(例如,ASP.NET集成在Autofac工作的方式),而不是在每个线程的基础上,如果可以的话。这可能会让你的生活更轻松,也会减轻你对多线程的担忧。@Steven:你的评论促使我编辑了我的问题,以澄清问题。当你说“在多个线程上注册是错误的”时,还有什么选择呢?你会建议我在原始问题中添加的委托绑定类型吗?@BrentArias:你能用实际用例的例子更新你的问题吗。这将允许我给你反馈,并告诉你如何解决这个问题。@Steven:添加了示例代码。它的工作原理完全符合预期——但我知道它不是线程安全的,并且会在真实环境中爆炸。}
public class AccountServiceRegistry : UnityContainerExtension, IBindingOverride
{
    //From UnityContainerExtension
    protected override void Initialize() 
    {
        Container.RegisterType<IAccountService, AccountService>();
    }

    //From IBindingOverride
    public void ReInitialize(IUnityContainer child, string action, object[] parms){

        child.RegisterType<AccountService>(new InjectionProperty("log"), new InjectionProperty("dao"));

        child.AddNewExtension<DataAccessRegistry>();

        string connectionString = action == "GetMoreData" ? "Alpha" : "Bravo";

        child.Configure<IDataAccessConfig>().WithConnection(connectionString);
    }
}
public class DataAccessRegistry: UnityContainerExtension, IDataAccessConfig
{
    [ThreadStatic]
    string connection;

    protected override void Initialize()
    {
        Container.RegisterType<IDataAccess>(new InjectionFactory(c => new DataAccess(connection)));
    }

    public IDataAccessConfig WithConnection(string connection)
    {
        this.connection = connection;
        return this;
    }
}