使用Lifestyle.Singleton

如何解决使用Lifestyle.Singleton

在我们的代码库中,我们使用了很多C#的COM对象,很少使用而不是使用Interop生成的* Class直接创建,而是使用ProgID来创建这些COM对象。

在这种情况下,以前基于NInject的代码可以正常工作,但现在决定继续使用SimpleInjector。

可以使用以下示例源代码轻松重现此内容 [添加到C:\ Windows \ System32 \ scrrun.dll的参考-“ Microsoft脚本运行时”以获取COM使用示例]

   public class TextFileCreator
   {
      private FileSystemObject _fso;
      public TextFileCreator(FileSystemObject fso)
      {
         _fso = fso;
      }

      public void Do()
      {
         string filename = _fso.GetTempName();
         var tf = _fso.CreateTextFile(filename);
         tf.WriteLine("Hello World");
         tf.Close();
      }
   }

   public class Program
   {
      static void Main(string[] args)
      {
         Container container = new Container();
         container.Register<TextFileCreator>();
         container.Register(typeof(FileSystemObject),() => {
            Type type = Type.GetTypeFromProgID("Scripting.FileSystemObject");
            FileSystemObject fso = (FileSystemObject)Activator.CreateInstance(type);
            return fso;
         },Lifestyle.Singleton);

         TextFileCreator textFileCreator = container.GetInstance<TextFileCreator>();
         textFileCreator.Do();
      }

      static void Mainoriginal(string[] args)
      {
         Type type = Type.GetTypeFromProgID("Scripting.FileSystemObject");
         FileSystemObject fso = (FileSystemObject)Activator.CreateInstance(type);
         TextFileCreator textFileCreator = new TextFileCreator(fso);
         textFileCreator.Do();
      }
   }

使用Lifestyle.Singleton注册的SimpleInjector:

container.Register(typeof(FileSystemObject),Lifestyle.Singleton);

正在生成以下异常

SimpleInjector.ActivationException:'配置无效。 为TextFileCreator类型创建实例失败。表达 类型'System .__ ComObject'不能用于以下对象的构造函数参数 类型为'Scripting.FileSystemObject'的验证已触发,原因是 已启用Container.Options.EnableAutoVerification。为了防止 容器从首次解析时开始验证,已设置 Container.Options.EnableAutoVerification为false。

但是如果不使用Lifestyle.Singleton,这是可行的。

解决方法

Simple Injector v5添加了对解析COM对象的支持,但仅限于使用RegisterInstance方法注册它们时。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?