我想要一个在 HTTPSession 中存储一些数据的类“DataSaver”。但我也希望能够改变主意,让工厂类创建一个对象,然后将其保存到文件或数据库中。
我希望能够像这样创建 DataSaver 对象:
IDataSaver obj = DataSaverFact.Create();
但显然,数据源将需要不同的资源,具体取决于实例化的对象(即保存在会话中的类将需要当前的 HTTPSession,数据库版本将需要连接字符串等...)
但我不想将任何东西传递给创建方法。
这甚至可能吗?
我正在考虑在我的工厂类中使用依赖注入,如下所示:
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 项目中使用