如何在运行时更新Autofac容器中的注册实例

j

我想在运行时中用ASP.NET MVC应用程序中的新实例替换Autofac中现有的注册实例。当我使用不同子类型的实例的集合时,注册是关键,尽管这似乎与我的问题无关。

应用程序启动时的初始注册

foreach (var instance in instances)
{
    builder.RegisterInstance(instance).Keyed<IInstance>(InstanceType.A); 
}
IContainer container = builder.Build();    
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

进一步,在控制器方法中,我执行以下操作:处置旧实例,获取新实例,创建新生成器,重新注册现有组件,还注册新实例,然后更新Autofac的ComponentContext

//...dispose old instances, obtain new instances

var builder = new ContainerBuilder();
foreach (var c in _componentContext.ComponentRegistry.Registrations)
{
    builder.RegisterComponent(c);
}
foreach (var instance in newInstances)
{
    builder.RegisterInstance(instance).Keyed<IInstance>(InstanceType.A);
}
builder.Update(_componentContext.ComponentRegistry);

下次我进入控制器方法时,在控制器构造函数中,旧实例将解析为IIndex<InstanceType, IInstance[]>,而不是新实例我究竟做错了什么?

西里尔·杜兰德

您的代码不起作用,因为它componentContext是当前作用域的上下文,而不是全局作用域。您可以查看此.NetFiddle以显示一些说明问题的代码:https ://dotnetfiddle.net/GNvOL4

如果您确实要替换实例,则使用提供程序会更简单:

class Program
{
    static void Main(string[] args)
    {
        ContainerBuilder builder = new ContainerBuilder();
        builder.RegisterInstance(new FooProvider(new Foo("a")))
               .As<FooProvider>();
        builder.Register(c => c.Resolve<FooProvider>().Value)
               .ExternallyOwned()
               .Keyed<Foo>(1);

        IContainer container = builder.Build();
        using (ILifetimeScope scope = container.BeginLifetimeScope())
        {
            Do(scope);
        }

        using (ILifetimeScope scope = container.BeginLifetimeScope())
        {
            IComponentContext context = scope.Resolve<IComponentContext>();
            container.Resolve<FooProvider>().Value = new Foo("b");
            Do(scope);
        }

        using (ILifetimeScope scope = container.BeginLifetimeScope())
        {
            Do(scope);
        }
    }

    static void Do(ILifetimeScope scope)
    {
        IIndex<Int32, Foo> index = scope.Resolve<IIndex<Int32, Foo>>();
        Foo foo = index[1];
        Console.WriteLine(foo.Value);
    }
}

public class FooProvider 
{
    public FooProvider(Foo value)
    {
        this._value = value;
    }

    private volatile Foo _value;
    public Foo Value
    {
        get
        {
            return this._value;
        }
    }

    public void ChangeValue(Foo value)
    {
        if(value == null)
        {
            throw new ArgumentNullException("value");
        }
        if(value == this._value)
        {
            return; 
        }

        Foo oldValue = this._value; 
        this._value = value;
        oldValue.Dispose();
    }

    public void Dispose() 
    {
        this._value.Dispose(); 
    }
}
public class Foo : IDisposable
{
    public Foo(String value)
    {
        this._value = value;
    }

    private readonly String _value;
    public String Value
    {
        get
        {
            return this._value;
        }
    }

    public void Dispose()
    {
        // do things
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在运行时在Autofac中定义嵌套对象的值

来自分类Dev

如何在Autofac中在运行时定义嵌套对象的值

来自分类Dev

如何在运行时更换 docker 容器

来自分类Dev

如何在运行时选择Spring bean实例

来自分类Dev

如何在运行时更改实例类型

来自分类Dev

如何在运行时创建该类的实例

来自分类Dev

如何在运行时在Java中创建新添加的类的实例

来自分类Dev

在ASP.NET Core中在运行时扩展Autofac IoC容器配置

来自分类Dev

WPF如何在运行时更新UI

来自分类Dev

如何在运行时更新python程序

来自分类Dev

WPF如何在运行时更新UI

来自分类Dev

我们如何在运行时更新OSGI中的任何捆绑软件

来自分类Dev

我们如何在运行时更新OSGI中的任何捆绑软件

来自分类Dev

如何在运行时在Typescript中添加属性

来自分类Dev

如何在运行时在NodeJS中触发分析?

来自分类Dev

如何在运行时读取dockerfile中的值

来自分类Dev

如何在运行时在Swing中添加JLabel?

来自分类Dev

如何在运行时在C中检测OS

来自分类Dev

如何在 Web API 中使用 AutoFac 在运行时解析服务?

来自分类Dev

如何在运行时更改分配给容器的资源?

来自分类Dev

如何在运行时将JPanel保留在父容器的顶部?

来自分类Dev

如何在运行时使用TypeTags创建类型T的实例

来自分类Dev

如何在运行时实例化Spring托管的bean?

来自分类Dev

Structuremap-如何在运行时获取命名实例并传递参数?

来自分类Dev

如何在运行时从Java对象获取实例变量的行号

来自分类Dev

方法如何在运行时查找其对象的实例变量

来自分类Dev

如何在运行时使用python动态创建新的类实例?

来自分类Dev

如何在运行时从ObservableCollection <T>派生的类的实例创建?

来自分类Dev

Autofac 注册关闭的类型并在运行时检索它们

Related 相关文章

  1. 1

    如何在运行时在Autofac中定义嵌套对象的值

  2. 2

    如何在Autofac中在运行时定义嵌套对象的值

  3. 3

    如何在运行时更换 docker 容器

  4. 4

    如何在运行时选择Spring bean实例

  5. 5

    如何在运行时更改实例类型

  6. 6

    如何在运行时创建该类的实例

  7. 7

    如何在运行时在Java中创建新添加的类的实例

  8. 8

    在ASP.NET Core中在运行时扩展Autofac IoC容器配置

  9. 9

    WPF如何在运行时更新UI

  10. 10

    如何在运行时更新python程序

  11. 11

    WPF如何在运行时更新UI

  12. 12

    我们如何在运行时更新OSGI中的任何捆绑软件

  13. 13

    我们如何在运行时更新OSGI中的任何捆绑软件

  14. 14

    如何在运行时在Typescript中添加属性

  15. 15

    如何在运行时在NodeJS中触发分析?

  16. 16

    如何在运行时读取dockerfile中的值

  17. 17

    如何在运行时在Swing中添加JLabel?

  18. 18

    如何在运行时在C中检测OS

  19. 19

    如何在 Web API 中使用 AutoFac 在运行时解析服务?

  20. 20

    如何在运行时更改分配给容器的资源?

  21. 21

    如何在运行时将JPanel保留在父容器的顶部?

  22. 22

    如何在运行时使用TypeTags创建类型T的实例

  23. 23

    如何在运行时实例化Spring托管的bean?

  24. 24

    Structuremap-如何在运行时获取命名实例并传递参数?

  25. 25

    如何在运行时从Java对象获取实例变量的行号

  26. 26

    方法如何在运行时查找其对象的实例变量

  27. 27

    如何在运行时使用python动态创建新的类实例?

  28. 28

    如何在运行时从ObservableCollection <T>派生的类的实例创建?

  29. 29

    Autofac 注册关闭的类型并在运行时检索它们

热门标签

归档