变量嵌套依赖的问题

本文关键字:问题 依赖 嵌套 变量 | 更新日期: 2023-09-27 18:11:13

在这种情况下,一个例子胜过千言万语:

    interface IProvider {
    }
    class DefaultProvider : IProvider {
        private readonly ProviderSettings settings;
        public DefaultProvider(ProviderSettings settings) {
            this.settings = settings;
        }
    }
    class ProviderSettings {
        string Name { get; set;}
    }
    class SystemProviderSettings : ProviderSettings {
        public SystemProviderSettings() {
            this.Name = "System";
        }
    }
    class ContextualProviderSettings : ProviderSettings {
        // etc.
    }

每个IProvider实现都应该对ProviderSettings有一个tor依赖,因为这允许我们在不改变应用程序的情况下切换提供商。

我们将默认的ProviderSettings连接为ContextualProviderSettings。正如您可能猜到的那样,这个集合是基于上下文的Name,假设是当前用户的名称。

然而,在某些情况下,我们想使用SystemProviderSettings。通常这是针对特定的服务:

    public class SomeSystemService : ISomeService {
        public SomeSystemService(IProvider provider) {
            // I need a provider scoped for the "system"
        }
    }

然后我用我的DI工具(StructureMap)连接这些依赖项:

For<ISomeService>().Use<SomeService>()
        .Ctor<IStorageProvider>()
            .Is(ctx => ctx.GetInstance<IStorageProvider>... this feels wrong

所以我认为这可以用更好的方式来完成。我尝试了装饰器模式,但我不想装饰特定的IProvider实现。我们的想法是有一个SystemProvider来包装任何被配置为默认IProvider的内容。

变量嵌套依赖的问题

一夜好眠的效果真神奇。

简单的解决方案,使用工厂:

public class IProviderFactory {
    IProvider Create(ProviderSettings settings);
}

我可以为每个提供程序实现创建一个工厂,并在运行时传递相关的ProviderSettings