使用内部 setter 进行属性注入

2024-06-20

我正在修改一个现有应用程序以使用 Autofac 属性注入。似乎无论我使用哪种方法向属性注册类型,属性始终为 null,除非它们具有公共设置器。对于其他 IoC 容器(例如 Structuremap),可以使用 setter 内部范围并使其可用InternalsVisibleTo程序集上的属性。这似乎可以很好地限制客户修改作业。

Autofac 可以做到这一点吗?或者在使用属性注入时是否有另一种方法来保证分配的安全?

我尝试过使用反射PropertiesAutoWired()以及解决.WithParameter()来自我的 WebApi Global.asax - 指定要设置的特定参数,但作为内部设置器没有成功。

[assembly: InternalsVisibleTo("MyWebAPI.dll")]
[assembly: InternalsVisibleTo("Autofac.dll")]
[assembly: InternalsVisibleTo("Autofac.Configuration.dll")]
namespace My.Namespace
{
    public class BaseContext
    {
        public MyPublicClass _dbHelper { get; internal set; }

        public BaseContext()
        {

        }

        protected string DbConnectionString
        {
            get
            {
                return _dbHelper.DbConn; //<-Always null unless setter is public
            }
        }
    }
}

你不能注射internal使用 autofac 设置器,因为AutowiringPropertyInjector类只寻找公共属性(参见source https://code.google.com/p/autofac/source/browse/Core/Source/Autofac/Core/Activators/Reflection/AutowiringPropertyInjector.cs).

然而其中的一个逻辑AutowiringPropertyInjector非常简单,因此您可以创建自己的版本来对非公共属性进行注入:

public static class AutowiringNonPublicPropertyInjector
{
     public static void InjectProperties(IComponentContext context, 
            object instance, bool overrideSetValues)
     {
          if (context == null)
              throw new ArgumentNullException("context");
          if (instance == null)
              throw new ArgumentNullException("instance");
          foreach (
             PropertyInfo propertyInfo in 
                 //BindingFlags.NonPublic flag added for non public properties
                 instance.GetType().GetProperties(BindingFlags.Instance |
                                                  BindingFlags.Public |
                                                  BindingFlags.NonPublic))
         {
             Type propertyType = propertyInfo.PropertyType;
             if ((!propertyType.IsValueType || propertyType.IsEnum) &&
                 (propertyInfo.GetIndexParameters().Length == 0 &&
                     context.IsRegistered(propertyType)))
             {
                 //Changed to GetAccessors(true) to return non public accessors
                 MethodInfo[] accessors = propertyInfo.GetAccessors(true);
                 if ((accessors.Length != 1 || 
                     !(accessors[0].ReturnType != typeof (void))) &&
                      (overrideSetValues || accessors.Length != 2 ||
                      propertyInfo.GetValue(instance, null) == null))
                 {
                     object obj = context.Resolve(propertyType);
                     propertyInfo.SetValue(instance, obj, null);
                 }
            }
        }
    }
}

现在您可以在OnActivated event

var builder = new ContainerBuilder();
builder.RegisterType<MyPublicClass>();
builder.RegisterType<BaseContext>()
    .OnActivated(args =>   
          AutowiringNonPublicPropertyInjector
              .InjectProperties(args.Context, args.Instance, true));

然而,上面列出的解决方案现在注入了所有类型的属性,甚至是私有和受保护的属性,因此您可能需要通过一些额外的检查来扩展它,以确保您只会注入您期望的属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用内部 setter 进行属性注入 的相关文章

  • jQuery 检查字体粗细是正常还是粗体

    我使用以下代码设置 font weight 属性 this css font weight normal 现在我想检查一个元素是否具有粗体或正常的字体粗细属性 我该怎么做 你可以使用以下方法得到它 fontWeight this css f
  • 使用 CQRS 处理中介管道中的错误/异常?

    我正在努力追随这个帖子 https lostechies com jimmybogard 2014 09 09 tackling cross cutting concerns with a mediator pipeline 由 Jimmy
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • WiX 属性引用另一个属性

    我正在尝试为我的应用程序创建多个快捷方式 通过使用在命令行上传递不同的参数Arguments的属性Shortcut http wix sourceforge net manual wix2 wix xsd shortcut htm元素 我希
  • 删除 IE 中的窗口属性

    我找不到有关此问题的任何信息 为什么下面的代码在 IE 中不起作用 window x 45 delete window x or delete window x IE 报告 对象不支持此操作 错误 这与 IE 问题中窗口属性的迭代有什么关系
  • 动态菜单创建IoC

    我想知道是否有人知道我如何创建如何使用 AutoFac 之类的东西来让我动态地允许 dll 创建自己的表单和菜单项以在运行时调用它们 所以如果我有一个 员工 dll 新入门表格 证书表格 供应商 dll 供应商详细信息来自 产品形态 在我的
  • Groovy:如何测试属性访问是否成功?

    我有一个变量 Object foo 它不为空 我想使用 foo bar 但前提是它不会用 没有这样的属性 类的栏 无论什么 来轰炸我 我应该如何进行以下测试 if test here use foo bar Use object hasPr
  • 如何判断枚举属性是否已设置? C#

    我有一个具有枚举属性的类 如下所示 public class Foo public Color ColorType get set public enum Color Red Green 现在这个类可以像这样初始化 var foo new
  • .properties 文件的 log4j2 KeyValuePair

    如何在属性文件中的 log4j2 中创建键值对 我知道在 log4j 版本 1 中它是这样完成的 log4j appender x additionalFields key value log4j2 中的 XML 方式是
  • 如何从java代码中检测操作系统语言(区域设置)

    从java代码中了解操作系统语言 区域设置 的正确方法是什么 我努力了 Locale getDefault System getProperties user language 但它们并不正确 实际上没有显示 系统区域设置 可以通过 Win
  • 检索 Autofac 容器以解析服务

    在 C WindowForms 应用程序中 我启动一个 OWIN WebApp 它创建另一个类 Erp 的单例实例 public partial class Engine Form const string url http 8080 49
  • abc.abstractmethod + 属性

    根据docs http docs python org 3 3 whatsnew 3 3 html abc它应该能够结合起来 property and abc abstractmethod所以以下应该在 python3 3 中工作 impo
  • 在派生类中使属性只读

    我正在重写派生类中的一个属性 我想将其设置为只读 C 编译器不允许我更改访问修饰符 因此它必须保持公共状态 最好的方法是什么 我应该扔一个InvalidOperationException in set 让二传手投掷InvalidOpera
  • 最终属性 @Value 中的 Spring 属性注入 - Java

    一个关于 Spring 从属性文件注入最终属性的简单问题 我有一个属性文件 我想在其中存储文件路径 通常 当我使用属性文件时 我使用如下内容设置类属性 private Value someProps prop field String so
  • 将时间戳变量添加到应用程序属性中的文件夹路径值

    所以我需要在 app properties 文件中设置一个文件夹路径名称值 我还想以当前时间戳命名它 这样当它用于创建文件时 它也会创建文件夹 我目前拥有的不起作用 screenshot events STARTED SUCCEEDED F
  • 无法在“System.String”类型上的多个长度相等的构造函数之间进行选择

    尝试解析类型时出现以下错误 无法在 System String 类型上的多个长度相等的构造函数之间进行选择 注册组件时 使用UsingConstructor 配置方法显式选择构造函数 该类型有 1 个构造函数 该构造函数采用IReposit
  • 如何组织 Java 属性条目以实现国际化?

    在我们的应用程序中 我们有一个 messages properties 文件 其中包含将显示给 UI 的所有字符串 我们有一个带有几个屏幕的小应用程序 它已经变得很笨拙 因为整个过程中都有重复的字符串值 现在 我们用页面特定的字符串进行组织
  • Objective-C 属性和内存管理

    给出以下属性定义 property nonatomic retain MyObject foo 以下代码是否会导致内存泄漏 self foo MyObject alloc init 看起来 alloc 调用将对象上的保留计数增加到 1 然后
  • Hibernate hbm2ddl.auto,可能的值以及它们的作用

    我正在看休眠hbm2ddl auto配置属性及其可能的值 validate update create create drop 所有这些值有什么作用 The Hibernate 参考文档 http docs jboss org hibern
  • 视频视图可以播放内部存储中存储的视频吗?

    我试图为我的用户提供使用外部或内部存储的能力 我正在显示图像和视频 具有科学性质 当将媒体存储在 SD 卡上时 一切都很好 但是当我在内部存储媒体时 只会显示图像 无论我尝试什么 在尝试加载和显示存储在 applicationcontext

随机推荐