是否可以在註冊表中註冊接口,然後「重新註冊」它以覆蓋首次註冊?結構圖 - 覆蓋註冊
即:
For<ISomeInterface>().Use<SomeClass>();
For<ISomeInterface>().Use<SomeClassExtension>();
我想在這裏上運行什麼是我的對象工廠返回SomeClassExtension
當我問ISomeInterface
。
在此先感謝!
是否可以在註冊表中註冊接口,然後「重新註冊」它以覆蓋首次註冊?結構圖 - 覆蓋註冊
即:
For<ISomeInterface>().Use<SomeClass>();
For<ISomeInterface>().Use<SomeClassExtension>();
我想在這裏上運行什麼是我的對象工廠返回SomeClassExtension
當我問ISomeInterface
。
在此先感謝!
好消息,我發現是的。這一切都取決於註冊表規則添加到對象工廠容器的順序。因此,如果您像我一樣使用多個註冊表類,則需要找到一種方法來優先將它們添加到容器中。
換句話說,而不是使用它得到錯誤的順序所有Registry
類.LookForRegistries()
,試圖找到所有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());
}
}
}