变量嵌套依赖的问题
本文关键字:问题 依赖 嵌套 变量 | 更新日期: 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