0

我想要一个在 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 项目中使用

4

1 回答 1

2

如果你已经定义了一个接口,并且具体对象的类型是在编译时定义的,那么我根本不明白你为什么需要 DI。您可以只拥有一个配置文件,其中包含工厂用来决定创建哪个对象的值。

例如

public DataSaverFact : IDataSaverFact
{
    public IDataSaver Create()
    {
      if config setting = "FileSaver" then
        return new FileSaver();
      else
        return new SessionSaver();
    }
}

如果您想避免硬编码的 IF 语句,那么您可以将类型定义存储在配置文件中,然后使用 Activator.CreateInstance 实例化返回对象

于 2012-12-07T00:52:44.327 回答