StructureMap 对象重新加载
StructureMap object reload
为了简化,我有一个 AppSettings:IAppSettings class 在应用程序启动时初始化:
ObjectFactory.Initialize(x =>
{
x.Scan(scan => {
scan.TheCallingAssembly();
scan.WithDefaultConventions();
});
x.AddRegistry<DataAccessRegistry>();
x.AddRegistry<AuthorizationRegistry>();
x.For<IAppSettings>()
.Use<AppSettings>()
.Ctor<Dictionary<string, string>>()
.Is(ctx =>
{
Dictionary<string, string> dict = new Dictionary<string, string>();
var sessionFactory = ctx.GetInstance<ISessionFactory>();
using (var session = sessionFactory.OpenSession())
using (var tx = session.BeginTransaction())
{
// query the SETTINGS table
foreach (Setting _setting in session.QueryOver<Setting>().List())
{
dict[_setting.Key] = _setting.Value;
}
tx.Commit();
}
return dict;
});
x.UseDefaultStructureMapConfigFile = false;
});
所以,在创建需要设置的class时,我简单地使用了下面的
public class AccessDataService {
private IAppSettings settings;
public AccessDataService(IAppSettings p_appSettings) {
settings = p_appSettings;
}
....
}
并且 structuremap 很好地将对象注入到我的 class.
实例中
但是,我希望能够显式触发数据库设置重新加载,所以我想知道是否有办法告诉 structuremap 清除 AppSettings 的所有现有对象并重新创建它们,再次从数据库加载设置?
干杯
您可以在每次需要刷新时使用 EjectAllInstancesOf 方法:
ObjectFactory.EjectAllInstancesOf<IAppSettings>();
ObjectFactory.Inject<IAppSettings>(*your new object*);
为了简化,我有一个 AppSettings:IAppSettings class 在应用程序启动时初始化:
ObjectFactory.Initialize(x =>
{
x.Scan(scan => {
scan.TheCallingAssembly();
scan.WithDefaultConventions();
});
x.AddRegistry<DataAccessRegistry>();
x.AddRegistry<AuthorizationRegistry>();
x.For<IAppSettings>()
.Use<AppSettings>()
.Ctor<Dictionary<string, string>>()
.Is(ctx =>
{
Dictionary<string, string> dict = new Dictionary<string, string>();
var sessionFactory = ctx.GetInstance<ISessionFactory>();
using (var session = sessionFactory.OpenSession())
using (var tx = session.BeginTransaction())
{
// query the SETTINGS table
foreach (Setting _setting in session.QueryOver<Setting>().List())
{
dict[_setting.Key] = _setting.Value;
}
tx.Commit();
}
return dict;
});
x.UseDefaultStructureMapConfigFile = false;
});
所以,在创建需要设置的class时,我简单地使用了下面的
public class AccessDataService {
private IAppSettings settings;
public AccessDataService(IAppSettings p_appSettings) {
settings = p_appSettings;
}
....
}
并且 structuremap 很好地将对象注入到我的 class.
实例中但是,我希望能够显式触发数据库设置重新加载,所以我想知道是否有办法告诉 structuremap 清除 AppSettings 的所有现有对象并重新创建它们,再次从数据库加载设置?
干杯
您可以在每次需要刷新时使用 EjectAllInstancesOf 方法:
ObjectFactory.EjectAllInstancesOf<IAppSettings>();
ObjectFactory.Inject<IAppSettings>(*your new object*);