【发布时间】:2017-02-04 09:25:09
【问题描述】:
我在我的项目中使用 Simple Injector 来连接所有必需的依赖项,但我无法调用 container.Verify,因为它会在实际的第一个请求之前为 http 配置创建一个 Singleton 实例
public interface IConfiguration { }
public class Configuration : IConfiguration
{
public Configuration()
{
var httpContext = HttpContext.Current;
var httpRequest = currentHttpContext.Request;
var httpRequestUrl = currentHttpRequest.Url;
this.UriScheme = currentHttpRequestUrl.Scheme;
this.UriHost = currentHttpRequestUrl.Host;
this.UriPort = currentHttpRequestUrl.Port;
}
public string UriScheme { get; private set; }
public string UriHost { get; private set; }
public int UriPort { get; private set; }
}
public class ServiceA
{
private readonly _configuration;
public ServiceA(IConfiguration configuration)
{
_configuration = configuration
}
}
public class ServiceB
{
private readonly _configuration;
public ServiceB(IConfiguration configuration)
{
_configuration = configuration
}
}
这是场景的一个基本示例。我目前有大约 60 个服务,全部取决于 IConfiguration
所有配置都需要在创建配置类时进行
这就是我在容器中注册实例的方法
var container = new Container();
//container.RegisterSingleton<IConfiguration, Configuration>();
var lazy = new Lazy<InstanceProducer>(() =>
Lifestyle.Singleton.CreateProducer(typeof(IConfiguration), typeof(Configuration), container));
container.Register<ServiceA>();
container.Register<ServiceB>();
container.Verify(); // Creates configuration class --> not desired
根据How can I skip verification of an object in the container
所以这里的技巧是在验证过程之后触发创建新的
InstanceProducer实例
我知道解决方法是使用 Lazy<T> 和 InstanceCreator,但我无法正确完成挂钩代码
编辑
Configuration 类没有依赖关系。 Configuration 的问题在于,它在 container.Verify 方法调用上被创建为 Singleton,而当时 currentHttpRequest.Url 不是实际的 url
我想我可以将配置从构造函数移动到方法(例如GetConfiguration)并进行一些重构,但我很好奇在问题的场景下是否可以实现延迟实例创建
【问题讨论】:
-
请详细说明
Configuration类的哪些部分阻止它被创建以及它有哪些依赖项。最好显示一些真实的代码。 -
此外,您阅读了this article,其中指出应用程序组件(例如
Configuration)的构建不应依赖于任何可能失败的事物,就像您的情况一样? -
@Steven:查看已编辑的问题
标签: c# .net dependency-injection inversion-of-control simple-injector