我有IRepository< T> ,并实现SqlRepository< T>。 SqlRepository在构造函数中有DataContext参数。
SM配置如下所示:
x.ForRequestedType(typeof(IRepository<>))
.TheDefaultIsConcreteType(typeof(SqlRepository<>));
x.ForRequestedType<DataContext>().CacheBy(InstanceScope.Hybrid)
.TheDefault.Is.ConstructedBy(()=>{
var dc = new FirstDataContext();
dc.Log = new DebuggerWriter();
return dc;
});
但是对于构建IRepository&lt; SpecificObject&gt;我想注入不同的DataContext。当我要求IReposiotry&lt; SpecificObject&gt;时,怎么说SM呢?我想要不同的DataContext,而不是FirstDataContext,而是SecondDataContext(DC转到不同的数据库)。
例如,当我要求IRepository&lt; T&gt;时我希望注入FirstDataContext,但是当我要求明确表示IRepository&lt; Product&gt;我想要注入SecondDataContext。
此外,第二个DC应该是SM的混合缓存!
答案 0 :(得分:4)
像...一样的东西。
ForRequestedType<DataContext>()
.CacheBy(InstanceScope.Hybrid)
.AddInstances(inst => inst.ConstructedBy(() =>
new SecondDataContext { Log = new DebuggerWriter() })
.WithName("secondDataContext"))
.TheDefault.Is
.ConstructedBy(() => new FirstDataContext {Log = new DebuggerWriter()});
ForRequestedType<IRepository<SpecificObject>>()
.TheDefault.Is
.OfConcreteType<SqlRepository<SpecificObject>>()
.CtorDependency<DataContext>()
.Is(inst => inst.TheInstanceNamed("secondDataContext"));
答案 1 :(得分:1)
这对我也很有帮助。有一个在构造函数中使用的具体类,而构造函数又在其构造函数中获取不同的连接字符串,具体取决于哪个“父”类正在使用它。感谢。
ObjectFactory.Initialize(x=>
{
// Different connection string for each usage
// of the RelationalGateway class
x.ForRequestedType<RelationalGateway>()
.AddInstances(r =>
r.ConstructedBy(() =>
new RelationalGateway(ConfigRepository.DataSourceName))
.WithName("config"))
.TheDefault.Is.ConstructedBy(
() => new RelationalGateway(OracleSpatialRepository.DataSourceName));
// Inject the right RelationalGateway
x.ForRequestedType<IConfigRepository>()
.TheDefault.Is.OfConcreteType<ConfigRepository>()
.CtorDependency<RelationalGateway>().Is(inst =>
inst.TheInstanceNamed("config"));
x.ForRequestedType<ISpatialRepository>()
.TheDefault.Is.OfConcreteType<OracleSpatialRepository>()
.CtorDependency<RelationalGateway>().IsTheDefault();
// Other simple types
x.ForRequestedType<IIdGenerator>().TheDefaultIsConcreteType<IdGenerator>();
});