许可组件不能很好地与 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 能否很好地与用户控件配合使用?