Как применить IoC в строке подключения Development db и настройке строки подключения Production Db - PullRequest
0 голосов
/ 20 января 2011

Может ли кто-нибудь предоставить мне пример использования IoC (structureMap / Spring.Net) для замены строки подключения на уровне доступа к данным в разработке и производстве? (В C # если возможно)

Спасибо

Ответы [ 2 ]

0 голосов
/ 20 января 2011

Не знаю о 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");
    }
0 голосов
/ 20 января 2011

Чувак, я бы на твоем месте не стал

  1. При развертывании строки подключения для всех ваших сред будут распространяться на все ваши среды (проблема безопасности)
  2. Вы отклоняетесь от стандартной реализации, что означает боль в долгосрочной перспективе

Но если вам действительно нужно, вам, вероятно, придется сделать что-то вроде этого: (это может даже не работать)

<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()];
        }
    }
}
...