C# Castle Windsor-组件的暂存与生产连接字符串参数
我一直在努力解决这个问题,虽然任何老黑客都会选择优雅的方式来解决这个问题:) 我有一个已注册的存储库,如:C# Castle Windsor-组件的暂存与生产连接字符串参数,c#,asp.net-mvc,castle-windsor,C#,Asp.net Mvc,Castle Windsor,我一直在努力解决这个问题,虽然任何老黑客都会选择优雅的方式来解决这个问题:) 我有一个已注册的存储库,如: <castle> <properties> <myConnStr>Data Source=COMPUTERNAME\SQL2008;Initial Catalog=MyDB;Persist Security Info=True;User ID=username;Password=password</myConnStr> <
<castle>
<properties>
<myConnStr>Data Source=COMPUTERNAME\SQL2008;Initial Catalog=MyDB;Persist Security Info=True;User ID=username;Password=password</myConnStr>
</properties>
<components>
<component id="MyRepository" service="DomainModel.Abstract.IMyRepository, DomainModel" type="DomainModel.Concrete.MyRepository, DomainModel" lifestyle="PerWebRequest">
<parameters>
<connectionString>#{myConnStr}</connectionString>
</parameters>
</component>
</components>
数据源=COMPUTERNAME\SQL2008;初始目录=MyDB;持久安全信息=True;用户ID=用户名;密码=密码
#{myConnStr}
我正在尝试设置配置文件,以便不必修改各种部署选项的myConnStr属性部分。如果在第一次加载配置时只能建立一次connectionString,这很好(甚至很理想),但在设置容器时,我不知道如何设置此值
如果我没有使用castle windsor,我只需要定义多个连接字符串,如“connectionStringStaging”、“connectionStringProduction”,并根据我的环境(计算机名或URL)通过代码选择合适的连接字符串。我怎么能用温莎城堡的地产做这样的事?修改组件的“参数”而不是“属性”也是可以接受的。您不能执行类似于
<castle>
<properties>
<dev>Data Source=COMPUTERNAME\SQL2008;Initial Catalog=MyDB;Persist Security Info=True;User ID=username;Password=password</dev>
<stage>Data Source=COMPUTERNAME\SQL2008;Initial Catalog=MyDB;Persist Security Info=True;User ID=username;Password=password</stage>
<production>Data Source=COMPUTERNAME\SQL2008;Initial Catalog=MyDB;Persist Security Info=True;User ID=username;Password=password</production>
</properties>
<components>
<component id="MyRepository" service="DomainModel.Abstract.IMyRepository, DomainModel" type="DomainModel.Concrete.MyRepository, DomainModel" lifestyle="PerWebRequest">
<parameters>
<connectionString>#{dev|stage|production}</connectionString>
</parameters>
</component>
</components>
数据源=COMPUTERNAME\SQL2008;初始目录=MyDB;持久安全信息=True;用户ID=用户名;密码=密码
数据源=COMPUTERNAME\SQL2008;初始目录=MyDB;持久安全信息=True;用户ID=用户名;密码=密码
数据源=COMPUTERNAME\SQL2008;初始目录=MyDB;持久安全信息=True;用户ID=用户名;密码=密码
#{开发|阶段|生产}
否则,请查看如何使用configSource属性并将环境设置存储在3个单独的配置文件中
配置选项应该是代码库外部的显式活动。
IWindsorContainer=。。。
IWindsorContainer container = ...
container.Register(Component.For<IMyRepository>().ImplementedBy<MyRepository>()
.LifeStyle.PerWebRequest
.Parameters(Parameter.ForKey("connectionString").Eq(GetConnectionStringFromEnviroment())));
container.Register(Component.For().ImplementedBy()实现)
.livelope.PerWebRequest
.Parameters(Parameter.ForKey(“connectionString”).Eq(getconnectionstringfromenviromet());
其中getConnectionStringFromenViromet()
从配置的
部分或任何您想要的地方获取适当的连接
如果需要将其保存在XML配置中而不是代码中,可以:
- 为该特定参数编写一个
isubdependencysolver
- 使用(如果您已经在使用xml配置,这可能是最简单的解决方案) 免责声明:这是我写的东西
FWIW,这对您来说可能有些过分,但我已经编写了一个部署系统来处理类似的情况(不同服务器的不同配置);它叫。它目前正在开发中(但您可以下载的版本应该可以正常工作,达到合理的程度:P),所以我不建议立即使用它;但是,可以在开发/登台环境中尝试一下,看看它是否有用。它比您需要的做得更多,但可能会引起您的兴趣:)我更喜欢一个简单的解决方案,而不是推动框架为您发挥魔力。我将在另一个类中包装连接字符串,以提供到存储库的正确连接,并将其添加到依赖关系树中
public interface IConnectionFactory
{
public string GetConnectionString();
}
将其传递到您的“存储库”中,而不是字符串。“配置选择应该是代码库外部的显式活动。”->我同意,但如果OP希望基于计算机名或URL选择连接,则必须在某个地方有代码……我也同意,但我不喜欢任何支持这种方法的解决方案。在每次发布之前修改web.config非常容易出错,用于自动合并/更新web.config的各种解决方案(msbuild自定义、web部署项目等)非常复杂。这对于大型项目来说是可以的,但在我的环境中,我们支持数百个应用程序,并且有初级开发人员,他们需要能够从源代码安全获取解决方案,进行快速更改并发布。希望VS2010中的“transforms”解决方案能起到作用。dev | stage |产品的目的是指示或选择其中一个并坚持在这里=)我个人使用configSource属性并将模板文件存储在源代码管理中的变体,这意味着您可以签出/克隆源代码,复制模板并重命名它,编辑所需的任何设置,就可以开始了。如果一个初级开发人员不能做到这一点-他们应该回到幼儿园=)我最终选择了另一个解决方案,但这正是我最初想要的-谢谢!完美的我早期的一个解决方案是让我的存储库接受一个返回字符串的委托,看看是否可以让Windsor注入一个。我无法让它工作,但这基本上是一样的。它当然可以工作,但如果你对每个“动态”参数使用这种方法,你最终会得到很多可以很容易避免的接口和类。测试也变得更加困难,因为您需要模拟IConnectionFactory,而不仅仅是传递字符串。温莎常见问题解答中添加了一个问题: