如何在Development db连接字符串和Production Db连接字符串设置中应用IoC

时间:2011-01-20 04:40:16

标签: c# database connection-string ioc-container

任何人都可以向我提供一个使用IoC(structureMap / Spring.Net)来交换开发中的数据访问层中的连接字符串的示例。生产? (如果可能的话,在C#中)

谢谢

2 个答案:

答案 0 :(得分:0)

如果我是你,我会不会这样做

  1. 部署时,所有环境的连接字符串将遍及所有环境(安全问题)
  2. 你正在偏离标准的实施,这意味着长期的痛苦
  3. 但如果你真的需要,你可能不得不做这样的事情:(这可能不起作用)

    <db:provider id="PRODDbProvider" provider="SqlServer-2.0" connectionString="whateveritis" />
    
    <db:provider id="DEVDbProvider" provider="SqlServer-2.0" connectionString="whateveritis" />
    
    <object id="genericAdoTemplate" type="CustomAdoTemplate">
    <property name="DbProviders">
      <dictionary>
        <entry key="PROD" value="PRODDbProvider" />
        <entry key="DEV" value="DEVDbProvider" />
      </dictionary>
    </property>
    </object>
    

    然后有一个自定义的AdoTemplate

    public class CustomAdoTemplate : Spring.Data.Generic.AdoTemplate {
    
        public object DbProviders {
            get;
            set;
        }
    
        public override object DbProvider {
            get {
                return DbProviders[GetCurrentEnvironmentKey()];
            }
        }
    }
    

答案 1 :(得分:0)

不了解Spring.Net但是我通常在ASP.Net中这样做,假设您有一个接受数据库连接字符串的DAL。

<connectionStrings>
    <add name="Development" connectionString="Enlist=false;MultipleActiveResultSets=True;Data Source=MYPC\SQLEXPRESS;Initial Catalog=Development;Integrated Security=True" providerName="System.Data.SqlClient"/>
    <add name="Production" connectionString="Enlist=false;MultipleActiveResultSets=True;Data Source=MYPC\SQLEXPRESS;Initial Catalog=Production;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>

public class MySession : ISession
{
    public MySession(string connectionName)
    {
        // ...
    }
}

ObjectFactory.Initialize(
    x =>
    {
         x.For<ISession>()
          .Use<MySession>().Ctor<string>("connectionName").Is("Development");
          //.Use<MySession>().Ctor<string>("connectionName").Is("Production");
    }