У меня есть такие значения в моем AppConfig ...

<appSettings>
<add key="id" value="1234" />
</appSettings>

В классе IAppConfig у меня есть ...

 public interface IAppConfig
 {
    string id{ get; }
 }
   
   [ConfigurationProperty("id")]
    public string id
    {
        get
        {
            return (string)this["id"];
        }
        set
        {
            this["id"] = value;
        }
    }

В классе стартапов у меня есть

using SimpleInjector;

   public static Container Container;

    public static void Start()
    {
        Container = new Container();

         IAppConfig appConfig = (IAppConfig)ConfigurationManager.GetSection("appSettings");
         Container.Register<IAppConfig, AppConfig>(Lifestyle.Singleton);

    }

И я ввожу это в другой класс ...

       private readonly IAppConfig config;

    public ClassName(IAppConfig config)
    {
        this.config = config;
        
    }

Однако id (и другие значения) появляются как пустые строки. Это происходит в Getter. Я вызываю метод Start, прежде чем пытаться получить к ним доступ. Что я делаю неправильно?

c#
1
John 9 Июн 2021 в 00:04

2 ответа

Лучший ответ

Вы создали объект appconfig, но не зарегистрировали его для внедрения.

Попробуйте следующее:

Упростите свой класс AppConfig

 public class AppConfig
 {
    public string id{ get; set; }
 }

 var appconfig = new AppConfig{ id = ConfigurationManager.AppSettings["id"] };
 
container.Register<AppConfig>(() => appconfig, Lifestyle.Singleton);

Вы также можете сохранить шаблон интерфейса

0
Ankit Raonka 8 Июн 2021 в 22:58

Вы регистрируете тип AppConfig как одноэлементную реализацию типа IAppConfig, поэтому, когда вы запрашиваете IAppConfig из контейнера, вы получаете экземпляр, созданный контейнером, а не 'appConfig', созданный вами в { {X3}}. Вам нужно зарегистрировать экземпляр, например:

Container.Instance<IAppConfig>(appConfig);
1
Quercus 8 Июн 2021 в 21:39