对于我的应用程序,我正在尝试编写配置控制器,以加载和保存某些模块的设置。为此,我将使用INI文件,其中节名称表示模块名称(或其他标识),以及键表示的值。
我在bootstrapper中注册了我的控制器,并在我的构造函数中使用接口在相应的类中注入。但是我每次需要获取或设置一个值时都不想输入模块名称,所以我尝试使用Caller信息来找出调用该方法的模块(或类),但这显然不起作用(返回空字符串)。
还有另一种方法可以实现我想要做的事情吗?
引导程序:
protected override void ConfigureContainer()
{
base.ConfigureContainer();
Container.RegisterType<IConfig, ConfigController>(new ContainerControlledLifetimeManager());
}
配置界面:
public interface IConfig
{
string[] GetSettings(string caller = "");
void Set<T>(string setting, T value, string caller = "") where T : class;
T Get<T>(string setting, string caller = "") where T : class;
}
答案 0 :(得分:1)
调用者参数的使用容易出错。你有很多选择可以避免它:
为每个模块注册一个ConfigController。 Unity支持多个命名注册。您可以在模块初始化中为每个模块注入正确的控制器,或者使用Dependency
属性:
Container.Register<IConfig, ConfigController>("module1",
new InjectionConstructor("module1"))
.Register<IConfig, ConfigController>("module2",
new InjectionConstructor("module2"));
class Module1 {
public Module1([Dependency("module1")] IConfig config) {... }
}
定义并实现一个返回已配置的IConfig实现的IConfigFactory。
interface IConfigFactory {
IConfig Create(String moduleName);
}
ConfigController可以识别模块detecting the method the made the call。