是否可以在注册表中注册一个接口,然后“重新注册”它以覆盖第一次注册?
IE:
For<ISomeInterface>().Use<SomeClass>();
For<ISomeInterface>().Use<SomeClassExtension>();
我在运行时想要的是我的对象工厂SomeClassExtension
在我请求时返回ISomeInterface
。
提前致谢!
是否可以在注册表中注册一个接口,然后“重新注册”它以覆盖第一次注册?
IE:
For<ISomeInterface>().Use<SomeClass>();
For<ISomeInterface>().Use<SomeClassExtension>();
我在运行时想要的是我的对象工厂SomeClassExtension
在我请求时返回ISomeInterface
。
提前致谢!
好消息,我发现是的。这完全取决于将注册表规则添加到对象工厂容器的顺序。因此,如果您像我一样使用多个注册表类,则需要找到一种方法来优先将它们添加到容器中。
换句话说,不要使用.LookForRegistries()
which 以错误的顺序获取所有Registry
类,而是尝试查找所有Registry
文件,按照您想要的顺序设置它们并手动将它们添加到对象工厂容器中:
ObjectFactory.Container.Configure(x => x.AddRegistry(registry));
这样,您就可以完全控制您想要的规则。
希望能帮助到你 :)
当我需要在我的 SpecFlow 测试中覆盖注册表的某些部分时,我只是想添加我的解决方案。
我确实在搜索的早期就找到了这个线程,但它并没有真正帮助我找到解决方案,所以我希望它会对你有所帮助。
我的问题是“StoreRegistry”中的“DataContext”(由应用程序使用)使用“HybridHttpOrThreadLocalScoped”,我需要它在我的测试中是“瞬态的”。
The code looked like this:
[Binding]
public class MySpecFlowContext
{
...
[BeforeFeature]
private static void InitializeObjectFactories()
{
ObjectFactory.Initialize(x =>
{
x.AddRegistry<StoreRegistry>();
x.AddRegistry<CommonRegistry>();
});
}
}
要覆盖范围设置,您需要在注册中明确设置它。并且覆盖需要低于被覆盖的
The working code looks like this:
[Binding]
public class MySpecFlowContext
{
...
[BeforeFeature]
private static void InitializeObjectFactories()
{
ObjectFactory.Initialize(x =>
{
x.AddRegistry<StoreRegistry>();
x.AddRegistry<CommonRegistry>();
x.AddRegistry<RegistryOverrideForTest>();
});
}
class RegistryOverrideForTest : Registry
{
public RegistryOverrideForTest()
{
//NOTE: type of scope is needed when overriding the registered classes/interfaces, when leaving it empty the scope will be what was registered originally, f ex "HybridHttpOrThreadLocalScoped" in my case.
For<DataContext>()
.Transient()
.Use<DataContext>()
.Ctor<string>("connection").Is(ConnectionBuilder.GetConnectionString());
}
}
}