我想使用属性注入将我的类(IDateTimeService)注入扩展类,如您所见:
public static class DateTimeGetter
{
public static IDateTimeService Localdate { set; get; }
public async static Task<DateTime> FromService(this DateTime value)
{
//ocaldate = localdate;
return await Localdate.Get();
}
}
我已经使用restaase使用接口连接到另一个微服务,如您所见:
public interface IDateTimeService
{
[AllowAnyStatusCode]
[Get("api/LocalTime")]
Task<DateTime> Get();
}
最后我将注入代码添加到我的启动文件中:
builder.RegisterType<IDateTimeService>();
问题是,当我运行我的服务时,Localdate属性为null:
防止将Volatile Dependencies]存储到静态字段中,因为这会导致Ambient Context anti-pattern:
is:环境上下文通过使用静态类成员为组成根外部的应用程序代码提供对挥发性依赖关系或其行为的全局访问。
A Volatile Dependency
涉及有时可能不希望出现的副作用的依赖性。其中可能包括尚不存在的模块,或对其运行时环境有不利要求的模块。这些是DI解决的依赖关系,并隐藏在抽象后面。
相反,有几种解决方案:
IDateTimeService
到静态FromService
方法中。 (请参见示例1)DateTimeGetter
升级为实例类,并使用以下命令注入IDateTimeService
Constructor Injection放入DateTimeGetter
的构造函数中。 (请参见示例2)public static class DateTimeGetter
{
public async static Task<DateTime> FromService(
this DateTime value, IDataTimeService timeProvider)
{
return await timeProvider.Get();
}
}
示例2:
public class DateTimeGetter : IDateTimeGetter
{
private readonly IDataTimeService timeProvider;
public DateTimeGetter(IDataTimeService timeProvider)
{
this.timeProvider = timeProvider ?? throw new ArgumentNullException("timeProvider");
}
public async Task<DateTime> FromService(
DateTime value, IDataTimeService timeProvider)
{
return await this.timeProvider.Get();
}
}
[当使用
构造函数注入]时,DateTimeGetter
本身必须注入其使用者。