Castle.Facilities.config配置文件中代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<facilities>
<facility id="ibatis" type="Castle.Facilities.IBatisNetIntegration.IBatisNetFacility, Castle.Facilities.IBatisNetIntegration">
<sqlMap id="sqlServerSqlMap" config="IBatisNet.SqlMap.config"/>
</facility>
<facility id="transaction" type="Castle.Facilities.AutomaticTransactionManagement.TransactionFacility, Castle.Facilities.AutomaticTransactionManagement"/>
</facilities>
</configuration>
IBatisNet.SqlMap.config配置文件中代码如下:
<?xml version="1.0" encoding="utf-8"?>
<sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<properties resource="IBatisNet.Properties.config"/>
<settings>
<setting useStatementNamespaces="true" />
</settings>
<!--如不加此句默认为providers.config-->
<providers resource="IBatisNet.Providers.config"/>
<database>
<provider name="sqlServer2.0"/>
<dataSource name="DbString" connectionString="${ConnectionString}"/>
</database>
<sqlMaps>
<sqlMap embedded="test.xml,Test"/>
</sqlMaps>
</sqlMapConfig>
IBatisNet.Properties.config配置文件中代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<settings>
<add key="ConnectionString" value="Data Source=127.0.0.1;Initial Catalog=Test;User ID=加密后字符串;Password=加密后字符串" />
</settings>
Windsor容器代码如下:
public class IocContainer
{
private IWindsorContainer _container;
private static IocContainer _instance = null;
private static readonly object _lock = new object();
private IocContainer()
{
_container = new WindsorContainer(new XmlInterpreter());
}
private static IocContainer Instance
{
get
{
lock (_lock)
{
if (_instance == null)
{
_instance = new IocContainer();
}
return _instance;
}
}
}
public static IWindsorContainer GetContainer()
{
return Instance._container;
}
public static T Get<T>()
{
return (T)GetContainer()[typeof(T)];
}
}
参考网上博文,本来考虑在生产容器的构造方法IocContainer()中增加以下代码,但未生效,最终生效的还是配置文件中的连接字符串:
DomSqlMapBuilder builder;
string connection;
NameValueCollection properties;
connection = "";
// Put the string in collection to pass to the iBATIS configurator
properties = new NameValueCollection();
properties.Add("connectionString", connection);
// Build the iBATIS configurator
builder = new DomSqlMapBuilder();
builder.Properties = properties;
builder.Configure("IBatisNet.SqlMap.config");
解决方法:数据访问层基类中的代码由之前的代码段1,改为代码段2,代码如下:
public class BaseDao
{
//代码段1:
//protected ISqlMapper sqlMapper = IocContainer.Get<ISqlMapper>();
//代码段2:
protected ISqlMapper sqlMapper = GetSqlMapper();
protected static ISqlMapper GetSqlMapper()
{
ISqlMapper sqlMapper = IocContainer.Get<ISqlMapper>();
if (sqlMapper.DataSource.Name == "DbString") // 此处Name对应IBatisNet.SqlMap.config中dataSource配置项的name
{
string connectionString = sqlMapper.DataSource.ConnectionString;
sqlMapper.DataSource.ConnectionString = GetConnectionString(connectionString); // 返回解密后的字符串
sqlMapper.DataSource.Name = "@DbString"; // 标识为已解密,避免重复解密导致报错
}
return sqlMapper;
}
}