2

私はいくつかの奇妙なコードの問題を経験してきましたが、最終的にシングルトンとして機能するはずのものが実際にはシングルトンではないことに気付いたようです。これはキャッシュ クラスであるため、同じキャッシュの複数のバージョンを持つことになります。以下のようにいくつかのテストコードを書きましたが、私の目にはこれでうまくいくはずです。私は何か間違ったことをしていますか、それともバグに遭遇しましたか?

public class GenericClassesNotRegisteredAsSingletonTest
{
    public interface ICacheManager<T> { }

    public class SettingsData { }

    public class SettingsCache : CacheManager<SettingsData> { }

    public class CacheManager<T> : ICacheManager<T> { }

    [Test]
    public void Test()
    {
        var container = new Container();

        var registration = Lifestyle.Singleton
            .CreateRegistration(typeof(SettingsCache),
                typeof(SettingsCache), container);

        container.AddRegistration(
            typeof(ICacheManager<SettingsData>), registration);

        container.Verify();

        var cache1 = container.GetInstance<SettingsCache>();
        var cache2 = container.GetInstance<SettingsCache>();

        bool sameRef = cache1 == cache2;
        Assert.That(sameRef == true);
    }
}
4

1 に答える 1

4

次の登録を行いました。

_container.AddRegistration(
    serviceType: typeof(ICacheManager<SettingsData>),
    registration: registration);

そして、あなたは次の解決を行っています:

_container.GetInstance<SettingsCache>();

SettingsCache明示的に登録していませんが、 ICacheManager<SettingsData>. は具体的なクラスであるためSettingsCache、Simple Injector はそれを一時的なインスタンスとして解決します。

SettingsCache解決策は、明示的に登録するか、ICacheManager<SettingsData>代わりに解決することです。Registration同じインスタンスを使用して 2 つ目の登録を行うことができます。例えば:

_container.AddRegistration(
    serviceType: typeof(SettingsCache),
    registration: registration);

診断サービスは、この種の構成ミスについて警告します。

于 2013-06-20T17:23:27.947 に答える