许可组件不能很好地与 DI 设计配合使用

Posted

技术标签:

【中文标题】许可组件不能很好地与 DI 设计配合使用【英文标题】:Licensed component not playing well with DI design 【发布时间】:2011-04-15 03:50:08 【问题描述】:

我们已经获得了一些第三方电子邮件组件的许可,并为我们的系统开发了一组组件来使用它们。然后这些组件在运行时由 IoC 容器动态加载。

但是,我们最近在非开发机器上进行测试时注意到,因为“托管”我们的组件的主要 .EXE 不引用也不包含第三方电子邮件组件的 .licx(关注点分离以及所有这些)它导致第三方电子邮件组件的许可证检查失败。

这里面还有吗?

这似乎是整个 LicenseManager、.licx 等 .NET 故事中的一个相当大的缺陷?

谢谢!

【问题讨论】:

你必须将它包含在你的项目中,没有其他办法。因为 Licx 文件实际上在同一个应用程序中创建了一个嵌入式资源。 【参考方案1】:

许可证文件就像配置文件一样 - 您可以创建引用它们的库,但最终有一个工件必须与可执行文件一起存在于磁盘上。

我假设您有一个 .licx 文件,只是不想从应用程序项目中以任何方式引用它。您可以通过在安装程序中包含 .licx 文件来避免这种情况 - 它最终会出现在磁盘上正确的位置,而应用程序项目并不明智。

【讨论】:

【参考方案2】:

进一步调查 LicenseManager 后,Validate 方法似乎只扫描当前应用程序域的调用程序集(许可证信息存储为带有“.licenses”扩展名的嵌入式资源)。

一种解决方案是在单独的应用程序域中运行代码。这样,第三方组件中的 LicenseManager 只扫描当前程序集的嵌入资源,即

    string assemblyPath = Assembly.GetExecutingAssembly().Location;
    AppDomainSetup appSetup = new AppDomainSetup();
    appSetup.ApplicationBase = new FileInfo(assemblyPath).DirectoryName;
    var newDomain = AppDomain.CreateDomain("NewDomain", AppDomain.CurrentDomain.Evidence, appSetup);
    var myClassInstance = (MyClass)newDomain.CreateInstanceFromAndUnwrap(assemblyPath, typeof(MyClass).FullName);
    myClassInstance.myMethod("foo");

要完成这项工作,您还需要从 MarshalByRefObject 继承“MyClass”(以及在两个 AppDomain 之间传递的任何类)。

【讨论】:

以上是关于许可组件不能很好地与 DI 设计配合使用的主要内容,如果未能解决你的问题,请参考以下文章

ffmpeg xfade 不能很好地与 crossfade 配合使用

Google Drive API 不能很好地与 ProGuard (NPE) 配合使用

导入 django.contrib.auth.urls 不能很好地与现有的管理模板配合使用

Caliburn.Micro 能否很好地与用户控件配合使用?

当 sleep() 不能很好地与警报一起工作时,我还能做啥“睡眠”?

python 子进程不能很好地与 gsutil 复制/移动命令一起使用