如何解决使用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 举报,一经查实,本站将立刻删除。