我们在使用Castle.Windsor实例化一个SqlConnection时遇到了奇怪的问题,使用了一个类型工厂:
注册的代码如下:
现在,当我尝试使用这段代码访问新的连接时:
这个异常的问题在于,.NET 4.5.1版本的System.Data中的
如果项目配置为.NET 4.5.1,则会出现构建错误,但在将AccessToken配置为.NET 4.6时会出现运行时错误。有任何想法是为什么Castle.Windsor会尝试创建v4.6 SqlConnection而不是.NET 4.5.1?解决/欺骗:我可以通过告诉Castle忽略该属性来避免这个问题,但这似乎是一个欺骗。这需要将其添加到注册中的PropertiesIgnore中。
注册的代码如下:
container.Register(Component.For<IDbConnectionFactory>().AsFactory().LifestyleTransient());
container.Register(Component.For<IDbConnection>().ImplementedBy<SqlConnection>()
.LifestyleTransient()
.DependsOn(Dependency.OnValue<string>
(ConfigurationManager.ConnectionStrings["DbConnectionString"].ConnectionString)));
还有IDbConnectionFactory
:
public interface IDbConnectionFactory
{
IDbConnection Create();
void Release();
}
现在,当我尝试使用这段代码访问新的连接时:
using (var connection = _connectionFactory.Create())
{
}
我遇到了一个异常:
An unhandled exception of type
'Castle.MicroKernel.ComponentActivator.ComponentActivatorException' occurred
in Castle.Windsor.dll
Additional information: Error setting property SqlConnection.AccessToken in component
System.Data.SqlClient.SqlConnection. See inner exception for more information.
If you don't want Windsor to set this property you can do it by either decorating it
with DoNotWireAttribute or via registration API.
Alternatively consider making the setter non-public.
这个异常的问题在于,.NET 4.5.1版本的System.Data中的
SqlConnection
类型不包含AccessToken
属性,而.NET 4.6版本中有。换句话说,如果我试图手动实现...var connection = new SqlConnection("connectionstring");
connection.AccessToken = "";
如果项目配置为.NET 4.5.1,则会出现构建错误,但在将AccessToken配置为.NET 4.6时会出现运行时错误。有任何想法是为什么Castle.Windsor会尝试创建v4.6 SqlConnection而不是.NET 4.5.1?解决/欺骗:我可以通过告诉Castle忽略该属性来避免这个问题,但这似乎是一个欺骗。这需要将其添加到注册中的PropertiesIgnore中。
container.Register(Component.For<IDbConnection>().ImplementedBy<SqlConnection>()
.PropertiesIgnore(info => info.Name.Equals("AccessToken"))
.LifestyleTransient()
.DependsOn(Dependency.OnValue<string>
(ConfigurationManager.ConnectionStrings["DbConnectionString"].ConnectionString)));