1

画像の処理を担当する 3 つのクラスがあります。ボスは私にそれをマージするように頼んだ。私はそれを 1 つのファイルにマージしましたが、彼は同じことだと言いました。一般的なロジックでマージする必要があります。これら 3 つのゲッターを一般的なゲッターにマージするにはどうすればよいでしょうか?? Type.GetType() に渡されるパラメーターの型のみが異なります。1 つの汎用ゲッターで 1 つの汎用属性を使用する必要があります。

public class BonusImageHandler
{
    private static IStorageProvider _BAstorageProvider; 
    private static IStorageProvider _BAWP8storageProvider;
    private static IStorageProvider _M4MstorageProvider;

    private static readonly object _lock = new object();

    private static IStorageProvider BAStorageProvider
    {
        get
        {
            lock (_lock)
            {
                if (_BAstorageProvider == null)
                {
                    lock (_lock)
                    {
                        var storageProviderType = Type.GetType(BLL.Providers.ConfigurationProvider.Instance.BAStorageProviderTypeName);
                        _BAstorageProvider = (IStorageProvider)Activator.CreateInstance(storageProviderType);
                    }
                }
            }
            return _BAstorageProvider;
        }
    }

    private static IStorageProvider BAWP8StorageProvider
    {
        get
        {
            lock (_lock)
            {
                if (_BAWP8storageProvider == null)
                {
                    lock (_lock)
                    {
                        var storageProviderType = Type.GetType(BLL.Providers.ConfigurationProvider.Instance.BAWP8StorageProviderTypeName);
                        _BAWP8storageProvider = (IStorageProvider)Activator.CreateInstance(storageProviderType);
                    }
                }
            }
            return _BAWP8storageProvider;
        }
    }

    private static IStorageProvider M4MStorageProvider
    {
        get
        {
            lock (_lock)
            {
                if (_M4MstorageProvider== null)
                {
                    lock (_lock)
                    {
                        var storageProviderType = Type.GetType(BLL.Providers.ConfigurationProvider.Instance.M4MStorageProviderTypeName);
                        _M4MstorageProvider= (IStorageProvider)Activator.CreateInstance(storageProviderType);
                    }
                }
            }
            return _M4MstorageProvider;
        }
    }

}
4

3 に答える 3

2
private static IStorageProvider GetProvider(string typeName)
{
    return (IStorageProvider)Activator.CreateInstance(Type.GetType(typeName));
}

private static readonly Lazy<IStorageProvider> _BAstorageProvider =
    new Lazy<IStorageProvider>(
        () => GetProvider(
            BLL.Providers.ConfigurationProvider.Instance.BAStorageProviderTypeName),
        LazyThreadSafetyMode.ExecutionAndPublication);
private static readonly Lazy<IStorageProvider> _BAWP8storageProvider =
    new Lazy<IStorageProvider>(
        () => GetProvider(
            BLL.Providers.ConfigurationProvider.Instance.BAWP8StorageProviderTypeName),
        LazyThreadSafetyMode.ExecutionAndPublication);
private static readonly Lazy<IStorageProvider> _M4MstorageProvider =
    new Lazy<IStorageProvider>(
        () => GetProvider(
            BLL.Providers.ConfigurationProvider.Instance.M4MStorageProviderTypeName),
        LazyThreadSafetyMode.ExecutionAndPublication);

private static IStorageProvider BAStorageProvider
{
    get
    {
        return _BAstorageProvider.Value;
    }
}

private static IStorageProvider BAWP8StorageProvider
{
    get
    {
        return _BAWP8storageProvider.Value;
    }
}

private static IStorageProvider M4MStorageProvider
{
    get
    {
        return _M4MStorageProvider.Value;
    }
}

(ただし、依存関係コンテナーを使用することをお勧めします)

于 2012-08-02T12:40:00.440 に答える
2

このような方法:

public void GetProvider(string typeName, ref IStorageProvider provider)
{
    if (provider == null)
    {
        lock (_lock)
        {
            if (provider == null)
            {
                var storageProviderType = Type.GetType(typeName);
                provider = (IStorageProvider)Activator.CreateInstance(storageProviderType);
            }
        }
    }
}

トリックを行う必要があります。次に、次のように呼び出します。

private static IStorageProvider BAWP8StorageProvider
{
    get
    {
        GetProvider(BLL.Providers.ConfigurationProvider.Instance.BAWP8StorageProviderTypeName, ref _BAWP8storageProvider);
        return _BAWP8StorageProvider;
    }
}

個人的には_BAWP8StorageProviderクラスのメンバーを失い、代わりにプロパティを使用するだけです(これにより、醜いrefパラメーターも削除されます)。

于 2012-08-02T11:56:29.107 に答える
2

ヘルパー メソッド:

static IStorageProvider GetStorageProvider(ref IStorageProvider field, string name)
{
    lock(_lock)
    {
        if(field == null)
        {
            var storageProviderType = Type.GetType(name);
            field = (IStorageProvider)Activator.CreateInstance(storageProviderType);
        }
    }
    return field;
}

使用法:

private static IStorageProvider BAStorageProvider
{
    get
    {
        return GetStorageProvider(
            ref _BAstorageProvider,
            BLL.Providers.ConfigurationProvider.Instance.BAStorageProviderTypeName);
    }
}
于 2012-08-02T12:03:39.780 に答える