使用autofac将属性注入扩展类中

问题描述 投票:0回答:1

我想使用属性注入将我的类(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:

enter image description here

asp.net-core dependency-injection microservices autofac extension-methods
1个回答
3
投票

防止将Volatile Dependencies]存储到静态字段中,因为这会导致Ambient Context anti-pattern

环境上下文通过使用静态类成员为组成根外部的应用程序代码提供对挥发性依赖关系或其行为的全局访问。

A Volatile Dependency

is:

涉及有时可能不希望出现的副作用的依赖性。其中可能包括尚不存在的模块,或对其运行时环境有不利要求的模块。这些是DI解决的依赖关系,并隐藏在抽象后面。

相反,有几种解决方案:

    使用[[方法注入注入IDateTimeService到静态FromService方法中。 (请参见示例1)
  • DateTimeGetter升级为实例类,并使用以下命令注入IDateTimeServiceConstructor Injection放入DateTimeGetter的构造函数中。 (请参见示例2)
  • 示例1: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本身必须注入其使用者。
  • © www.soinside.com 2019 - 2024. All rights reserved.