我有以下工厂方法,只返回正确的IDatabase实现。我想将它重构为我的SimpleInjector容器,但不确定如何。
public class DALFactory
{
public static IDatabase GetDAL()
{
string asm = "SQL"; /* Hardcoded choice of DAL */
if (asm == "XML")
return new XmlDatabase();
if (asm == "SQL")
return new SqlDatabase();
return null;
}
}
我已经尝试了解如何注册一个集合,但是如何在我的程序中询问IDatabase实例时告诉SimpleInjector使用哪一个?对任何想法开放。只是一个理论计划,我正在尝试重构练习。到目前为止,DI(IoC)首次使用DI(IoC),这是一次令人愉快的眼睛开放体验!
我试过这样做,我关闭了吗?
Container.RegisterCollection<IDatabase>(new [] { typeof(SqlDatabase), typeof(XmlDatabase)});
Container.Register<IDatabase, XmlDatabase>(Lifestyle.Singleton);
Container.Register<IDatabase, SqlDatabase>(Lifestyle.Singleton);
答案 0 :(得分:1)
如果asm
值是硬编码的,或者基于配置文件中的值,则基本上说正在运行的应用程序只有一个特定版本的IDatabase
。
这意味着您应该注册:
string asm = "SQL"; /* Hardcoded choice of DAL */
if (asm == "XML")
container.Register<IDatabase, XmlDatabase>();
if (asm == "SQL")
container.Register<IDatabase, SqlDatabase>();