Factory Pattern用于创建使用不同数据源的对象

时间:2012-12-07 00:38:06

标签: c# asp.net-mvc-3 dependency-injection datasource factory-pattern

我希望有一个“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项目

1 个答案:

答案 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

实例化返回对象。