如何在Structuremap 4.4中设置覆盖注册

本文关键字:设置 覆盖 注册 Structuremap | 更新日期: 2023-09-27 18:13:40

所以我有一个容器,我在其中添加了一个注册表,定义了一个类的默认类型。

TestRegistry : Registry{
    For<Foo>.Use<Foo>();
}

此注册表在应用程序初始化期间在web服务开始时添加。在添加了用于应用程序的所有注册表之后,我需要直接覆盖Foo类的注册。所以:

Container.Instance.Configure(x => 
{
    x.AddRegistry<TestRegistry>();
    var fooInstance = new Foo();
    x.For<Foo>.Use(fooInstance);
}

当我去检索这个实例从我的容器

var fromContainer = Container.Instance.GetInstance<Foo>();

我现在得到了null。如果我使用get所有实例:

var fromContainer = Container.Instance.GetAllInstances<Foo>();

得到两个结果。每次注册一个。这是有道理的。

但是,如果我试图在第二次注册期间清除注册:

Container.Instance.Configure(x => 
{
    x.AddRegistry<TestRegistry>();
    var fooInstance = new Foo();
    x.For<Foo>.ClearAll().Use(fooInstance);
}
var fromContainer = Container.Instance.GetInstance<Foo>();

仍然返回null。我好像漏掉了什么。我希望这将清除Foo的所有注册并使用我最后注册的实例。

任何帮助都会很感激。提前感谢!

如何在Structuremap 4.4中设置覆盖注册

我找到了答案。在配置方法完成之前,看起来只有Container.Instance实际上不包含定义。这意味着为了覆盖实现,您需要使用覆盖第二次调用Container.Instance.Configure()。一旦我这样做了,它就开始像预期的那样工作了。