インターフェイスをレジストリに登録し、それを「再登録」して最初の登録を上書きすることは可能ですか?
いいえ:
For<ISomeInterface>().Use<SomeClass>();
For<ISomeInterface>().Use<SomeClassExtension>();
ここで実行時に必要なのは、オブジェクト ファクトリがSomeClassExtension
を要求したときに返されることですISomeInterface
。
前もって感謝します!
インターフェイスをレジストリに登録し、それを「再登録」して最初の登録を上書きすることは可能ですか?
いいえ:
For<ISomeInterface>().Use<SomeClass>();
For<ISomeInterface>().Use<SomeClassExtension>();
ここで実行時に必要なのは、オブジェクト ファクトリがSomeClassExtension
を要求したときに返されることですISomeInterface
。
前もって感謝します!
良いニュースです。そうであることがわかりました。すべては、レジストリ ルールがオブジェクト ファクトリ コンテナーに追加される順序に依存します。したがって、私のように複数のレジストリ クラスを使用している場合は、それらをコンテナーに追加する優先度を与える方法を見つける必要があります。
.LookForRegistries()
つまり、すべてのクラスを間違った順序で取得するを使用する代わりに、Registry
すべてのファイルを見つけて、Registry
必要な順序で設定し、手動でオブジェクト ファクトリ コンテナーに追加します。
ObjectFactory.Container.Configure(x => x.AddRegistry(registry));
そうすれば、必要なルールを完全に制御できます。
それが役に立てば幸い :)
SpecFlow テストでレジストリの一部をオーバーライドする必要があったときに、問題にソリューションを追加したかっただけです。
検索のかなり早い段階でこのスレッドを見つけましたが、解決策を見つけるのに実際には役立たなかったので、お役に立てば幸いです.
私の問題は、「StoreRegistry」(アプリケーションで使用される) の「DataContext」が「HybridHttpOrThreadLocalScoped」を使用し、テストで「Transient」にする必要があることでした。
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());
}
}
}