我希望有一个“DataSaver”类,它可以在HTTPSession中存储一些数据。但我也希望能够改变主意,让工厂类创建一个对象,而不是保存到文件或数据库。
我希望能够像这样创建DataSaver对象:
IDataSaver obj = DataSaverFact.Create();
但显然,数据源需要不同的资源,具体取决于获取实例化的内容(即会话中保存的类需要当前的HTTPSession,数据库版本需要连接字符串等等)
但我不想将任何内容传递给创建方法。
这甚至可能吗?
我正在考虑将Dependancy Injection与我的工厂类一起使用,如下所示:
public interface IDataSaverFact
{
IDataSaver Create();
}
public interface IDataSaver
{
public void Save(Object data);
}
public SessionSaver : IDataSaver
{
//PARAMETER REQUIRED SINCE SESSION ONLY AVAILABLE FROM CALLER DURING WEB REQUEST
public SessionSaver(HTTPSession session)
{
}
public void Save(Object data) {....}
}
public FileSaver : IDataSaver
{
//NO PARAMETER HERE. THIS WILL JUST SAVE TO A FILE FROM CONFIG
public FileSaver ()
{
}
public void Save(Object data) {....}
}
public DataSaverFact : IDataSaverFact
{
public IDataSaver Create()
{
* IS IT POSSIBLE/APPROPRIATE TO HOOK THIS UP VIA A DI FRAMEWORK? *
return new SessionSaver(session);
}
}
我看过几个例子,比如这里Is there a pattern for initializing objects created via a DI container,它们似乎与我上面的内容很接近,除了链接的例子是在创建时传递一个参数。
我不希望创建因工厂调用而异,但我希望能够在编译时更改DataSaver,如果出于技术原因决定更改数据源。
然后我只想改变我的工厂类
public DataSaverFact : IDataSaverFact
{
public IDataSaver Create()
{
return new FileSaver();
}
}
*编辑,这将用于MVC3项目
答案 0 :(得分:2)
如果你定义了一个接口,并且在编译时定义了具体对象的类型,那么我根本不明白为什么你需要DI。您可以只有一个配置文件,其中包含Factory用于决定要创建哪个对象的值。
e.g。
public DataSaverFact : IDataSaverFact
{
public IDataSaver Create()
{
if config setting = "FileSaver" then
return new FileSaver();
else
return new SessionSaver();
}
}
如果要避免使用硬编码的IF语句,则可以将类型定义存储在配置文件中,然后使用Activator.CreateInstance
实例化返回对象。