5

インターフェイスをレジストリに登録し、それを「再登録」して最初の登録を上書きすることは可能ですか?

いいえ:

For<ISomeInterface>().Use<SomeClass>();
For<ISomeInterface>().Use<SomeClassExtension>();

ここで実行時に必要なのは、オブジェクト ファクトリがSomeClassExtensionを要求したときに返されることですISomeInterface

前もって感謝します!

4

2 に答える 2

2

良いニュースです。そうであることがわかりました。すべては、レジストリ ルールがオブジェクト ファクトリ コンテナーに追加される順序に依存します。したがって、私のように複数のレジストリ クラスを使用している場合は、それらをコンテナーに追加する優先度を与える方法を見つける必要があります。

.LookForRegistries()つまり、すべてのクラスを間違った順序で取得するを使用する代わりに、Registryすべてのファイルを見つけて、Registry必要な順序で設定し、手動でオブジェクト ファクトリ コンテナーに追加します。

    ObjectFactory.Container.Configure(x => x.AddRegistry(registry));

そうすれば、必要なルールを完全に制御できます。

それが役に立てば幸い :)

于 2012-12-18T14:21:10.460 に答える
2

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());
        }
    }
}
于 2015-06-24T14:20:26.687 に答える