我们有一个公共的类库项目,其中有一个名为say MyClass的类,该类实现了IMyClass。
public class MyClass : IMyClass
{
private readonly string _myConfigPath;
public TimeSheet(MyConfigPath myConfigPath)
{
_myConfigPath= myConfigPath.Value;
}
public void GetData(int id)
{
var values= _myConfigPath;
}
}
public interface IMyClass
{
void GetData(int id);
}
我的类MyConfigPath是从ConfigInjector.ConfigurationSetting抽象调用扩展的。
public class MyConfigPath : ConfigurationSetting<string>
{
}
在较旧的项目中,我们使用AutoFac通过ConfigInjector注入配置设置。
但是现在我们正在基于.Net Core2.1的新项目中,我们必须使用以MyClass编写的业务逻辑。
尽管我可以像这样在新项目的控制器中注入IMyClass类型
services.ConfigurePOCO<MyConfigPath>(configuration.GetSection("AppSettings:MyConfigPath"));
services.AddTransient<IMyClass , MyClass>();
但是分配给_myConfigPath的值仍然为空,因为我们没有为configinjector提供任何配置信息。
我试图遵循 StrathWeb Blog和Rick Strahl's Web Log 但是这些仅用于强类型对象,而不适用于configinjector。
我已经尝试过两种方式
services.Configure<MyConfigPath >(configuration.GetSection("AppSettings:MyConfigPath "));
并创建StrathWeb Blog指定的扩展方法。
services.ConfigurePOCO<MyConfigPath>(configuration.GetSection("AppSettings:MyConfigPath"));
更改类库项目的机会很少,因为许多其他项目不在.net核心上。 这是我的appsettings.json文件的方式
{
"AppSettings": {
"MyConfigPath": "C:\\EmployeeUpload"
}
}
任何帮助将不胜感激。
答案 0 :(得分:1)
首先,如果您使用的是.Configure
方法,则不会注入MyConfigPath
,而是注入IOptions<MyConfigPath>
(请再次关注第一个链接)。因此,您的注射变成这样:
public MyClass(IOptions<MyConfigPath> myConfigPathOptions)
第二,configuration.GetSection
用于访问整个节,而不仅仅是字符串。如果要直接从JSON访问“ MyConfigPath”,则可以使用configuration["AppSettings:MyConfigPath"]
。您可以像GetSection
这样使用configuration.GetSection("AppSettings")
,以整体获取所有应用程序设置。
我建议您查看IConfiguration和IOptions的文档
我认为您真正想做的是这样的:
为您的所有设置创建一个班级:
public class MyAppSettings {
public string MyConfigPath {get; set;}
public int MyOtherSetting { get; set; } // sample of how you could have more
}
上面添加了“ MyOtherSetting”的json看起来像这样:
{
"AppSettings": {
"MyConfigPath": "C:\\EmployeeUpload",
"MyOtherSetting" : 501
}
}
在启动类中,您可以使用以下代码:
services.Configure<MyAppSettings>(configuration.GetSection("AppSettings")
现在,对于注射,您将需要使用以下内容:
MyClass(IOptions<MyAppSettings> settingOptions)
{
_myConfigPath = myConfigPath.Value.MyConfigPath;
}
答案 1 :(得分:0)
我已经找到解决我所面临问题的方法。一点点使用反射在这里帮助了我。
下面是解决方法
var type= typeof(MyConfigPath);
var t = Activator.CreateInstance(type);
PropertyInfo propertyInfo = type.GetProperty("Value");
var configValue = configuration.GetValue<string>($"AppSettings:{type.Name}");
if (!string.IsNullOrEmpty(configValue) && propertyInfo != null)
{
propertyInfo.SetValue(t, configValue, null);
}
services.AddSingleton(type, t);
通过这种方式,我能够注入我的强类型类。我之所以使用反射,是因为我必须对类库中的许多类型做同样的事情。
我通过一些研发和与团队的讨论获得了这个想法。