Castle.Facilities.config配置文件中代码如下:
IBatisNet.SqlMap.config配置文件中代码如下:
IBatisNet.Properties.config配置文件中代码如下:
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()
{
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();
//代码段2:
protected ISqlMapper sqlMapper = GetSqlMapper();
protected static ISqlMapper GetSqlMapper()
{
ISqlMapper sqlMapper = IocContainer.Get();
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;
}
}



