Castle.Windsor使用Dapper实例化错误版本的SqlConnection

英格夫·尼尔森(Yngve B-Nilsen)

使用Castle.Windsor使用类型化的工厂实例化SqlConnection时,我们遇到了一个奇怪的问题:

注册看起来像这样:

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.

此异常的问题是SqlConnection.NET 4.5.1的System.Data中的类型不包含该属性,AccessToken而.NET 4.6的类型中包含该属性换句话说,如果我尝试手动执行

var connection = new SqlConnection("connectionstring");
connection.AccessToken = "";

如果为.NET 4.5.1配置了项目,则会出现构建错误,但是如果为.NET 4.6配置了项目,则在设置AccessToken时会出现运行时错误。

知道为什么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)));
奥拉夫·尼伯(OlavNybø)

从4.5开始,所有.NET版本都已就位更新,您可以在此处看到

这意味着,一旦安装了.NET 4.6,无论您如何实例化它,都将始终获得.NET 4.6版本的SqlConnection。

在Visual Studio中构建应用程序时,将针对特定版本的.NET Framework进行构建,该版本通常位于以下文件夹中:C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework

这意味着在构建msbuild时可以检查您使用的不是目标框架版本中没有的功能。

但是,当您运行64位应用程序时,它将使用通常位于C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319中的程序集

对于从.NET 4.0到.NET 4.6的所有版本,这是同一文件夹,这就是就地升级的意思。

因此,当您在安装了.NET 4.6的开发环境上执行应用程序时,您将始终获得.NET 4.6版本(至少除非您执行特殊操作以加载程序集的其他版本)。

Castle Windsor将尝试使用公共设置器设置属性,并且它将使用反射来查找属性,这意味着即使您是根据4.5.1进行构建的,它也会在.NET 4.6机器上找到.NET 4.6属性。

尝试设置AccessToken时失败的原因很可能是因为您的连接字符串与设置AccessToken不兼容。

如果您检查AccessToken setter源代码,即使尝试仅将AccessToken设置为空字符串,如果尝试为不兼容的连接字符串设置它,也会看到它将引发异常。

由于不需要将任何依赖项注入到SqlConnection对象中,因此还可以使用new运算符简单地创建它,然后避免因Windsors尝试注入连接属性而引起的问题。使用此注册应该可以:

container.Register(Component.For<IDbConnection>().ImplementedBy<SqlConnection>()
        .LifestyleTransient()
        .UsingFactoryMethod(() => new SqlConnection          
       (ConfigurationManager.ConnectionStrings["DbConnectionString"].ConnectionString)));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Bouncy Castle生成keyPair

来自分类Dev

XML配置中的Castle Windsor服务覆盖

来自分类Dev

WCF & Castle Windsor - Looks like you forgot

来自分类Dev

Castle.Windsor IoC容器特定配置

来自分类Dev

Castle Windsor re-create instance

来自分类Dev

Castle.Windsor CollectionResolver和组件订购

来自分类Dev

Castle Windsor Interceptors - 在 ctor 中获取目标

来自分类Dev

在 Castle.windsor 中注册窗体

来自分类Dev

如何使用 Castle Windsor 创建客户端版本 > 3.0.3660 的 RavenDB 会话?

来自分类Dev

使用Castle Windsor在WebAPI中进行依赖注入

来自分类Dev

使用Castle Windsor在WebAPI中进行依赖注入

来自分类Dev

在Windows窗体应用程序中使用Castle Windsor

来自分类Dev

使用 Castle Windsor fluent API 注册实现多个接口的组件

来自分类Dev

使用 Castle Windsor 在 QueryBus 中查找查询处理程序

来自分类Dev

Java Bouncy Castle TLS协议版本顺序?

来自分类Dev

Castle DynamicProxy自动属性初始化

来自分类Dev

Castle.ActiveRecord.PropertyAttribute.NotNull ...文档错误?

来自分类Dev

Java:使用Bouncy Castle进行PGP加密

来自分类Dev

如何告诉Web API / Castle Windsor路由引擎在我的存储库中使用其他数据库实例?

来自分类Dev

如何指定我希望控制器的构造函数接收的类实例(使用Web API,DI和Castle Windsor时)?

来自分类Dev

使用Bouncy Castle提供程序创建SSLContext实例

来自分类Dev

使用 Castle Windsor 在服务类的构造函数中使用参数化构造函数初始化类

来自分类Dev

Web API请求后需要EF DbContext的Castle Windsor Lifestyle

来自分类Dev

在Castle Windsor容器中注册多个类型的工厂

来自分类Dev

WPF ViewModel中的Castle Windsor构造函数注入

来自分类Dev

在Castle Windsor中注册同一接口的多个实现

来自分类Dev

在Castle Windsor容器中注册多个类型的工厂

来自分类Dev

如何在nuget库中管理Castle Windsor依赖项

来自分类Dev

具有构造函数参数的Castle Windsor安装程序

Related 相关文章

  1. 1

    使用Bouncy Castle生成keyPair

  2. 2

    XML配置中的Castle Windsor服务覆盖

  3. 3

    WCF & Castle Windsor - Looks like you forgot

  4. 4

    Castle.Windsor IoC容器特定配置

  5. 5

    Castle Windsor re-create instance

  6. 6

    Castle.Windsor CollectionResolver和组件订购

  7. 7

    Castle Windsor Interceptors - 在 ctor 中获取目标

  8. 8

    在 Castle.windsor 中注册窗体

  9. 9

    如何使用 Castle Windsor 创建客户端版本 > 3.0.3660 的 RavenDB 会话?

  10. 10

    使用Castle Windsor在WebAPI中进行依赖注入

  11. 11

    使用Castle Windsor在WebAPI中进行依赖注入

  12. 12

    在Windows窗体应用程序中使用Castle Windsor

  13. 13

    使用 Castle Windsor fluent API 注册实现多个接口的组件

  14. 14

    使用 Castle Windsor 在 QueryBus 中查找查询处理程序

  15. 15

    Java Bouncy Castle TLS协议版本顺序?

  16. 16

    Castle DynamicProxy自动属性初始化

  17. 17

    Castle.ActiveRecord.PropertyAttribute.NotNull ...文档错误?

  18. 18

    Java:使用Bouncy Castle进行PGP加密

  19. 19

    如何告诉Web API / Castle Windsor路由引擎在我的存储库中使用其他数据库实例?

  20. 20

    如何指定我希望控制器的构造函数接收的类实例(使用Web API,DI和Castle Windsor时)?

  21. 21

    使用Bouncy Castle提供程序创建SSLContext实例

  22. 22

    使用 Castle Windsor 在服务类的构造函数中使用参数化构造函数初始化类

  23. 23

    Web API请求后需要EF DbContext的Castle Windsor Lifestyle

  24. 24

    在Castle Windsor容器中注册多个类型的工厂

  25. 25

    WPF ViewModel中的Castle Windsor构造函数注入

  26. 26

    在Castle Windsor中注册同一接口的多个实现

  27. 27

    在Castle Windsor容器中注册多个类型的工厂

  28. 28

    如何在nuget库中管理Castle Windsor依赖项

  29. 29

    具有构造函数参数的Castle Windsor安装程序

热门标签

归档