使用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方法注册它们时。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...