我正在使用Unity和Prism V4在.NET中开发模块化应用程序。具有模块化设计的优点是能够容易地添加和移除特征。我需要创建添加或排除某些功能的应用程序版本。使用Prism和Unity,我可以通过加载所需功能的程序集(.dll文件)来完成此操作。我喜欢这个,因为它允许我干净而精确地排除整个功能。
我在某些版本的应用程序中有某些绝对不能包含的功能,以承担我们自己的责任。我想阻止用户将其他用户的.DLL文件复制到他的目录中以获得该功能。其他有类似顾虑的人可能有兴趣将“插件模块”作为升级到其他产品的销售,并限制对购买该附加组件的用户的访问权限。这不是我们正在做的事情,但也不能完全排除。
现在,使用Prism和Unity,有多种方法可以注册模块目录,包括代码,目录,应用程序配置XML文件,或者您可以自己编写。最简单的方法之一是应用程序的shell引用每个程序集,代码专门加载该配置的程序集文件。这确实使得从其他人简单地复制文件并获得该功能稍微困难一些。但是,我担心它可能导致配置错误的可能性,或者阻止更通用的“附加”场景(即你需要重新编译应用程序shell以包含功能)。
如果我对要加载的程序集进行硬编码,我可能需要在构建环境变量上使用#ifdef来确定应该加载哪些模块。如果他们获取shell可执行文件和其他库,这并不能真正阻止某些人复制文件。跟踪进入不同安装程序项目的特定构建并阻止购买的附加方案似乎更加困难。对我来说,最好是应用程序的shell不需要直接引用模块。也许,它可以从特定位置加载程序集,但可以某种方式用产品密钥或其他地方验证,用户应该可以访问该模块。
如果有人对如何许可模块或限制对应用程序的不同用户(版本)访问模块的经验或洞察力,我感兴趣。基本应用程序可能完全免费,不需要许可证。可能没有什么是万无一失的,但我需要尽我所能让某人绕过系统并不容易。另一个要求是我不相信我可以要求我的用户可以访问互联网(如果有某种许可方法需要这样做)。当然,我不确定这不仅限于.NET,Prism或Unity的讨论,但我正在使用这个项目。
使用强密钥名称对每个程序集进行签名可以帮助我验证模块是否来自受信任的来源,但我不确定这对许可是否有帮助。也许有一个可以使用的产品密钥系统,它可以指示允许哪些模块?无论如何,我会停在那里,因为我对解决这个问题的任何方法持开放态度,我不想把讨论集中在一个特定的想法或路径上。
提前感谢您的帮助。
答案 0 :(得分:1)
我认为可以使用以下方法完成:
1)扩展您在Unity中获得的正常LifeTimeManagers。这些用于控制何时处理对象,并允许您从Unity
中删除注册如何使用LifeTimeManager从Unity中删除项目:StackOverflow Answer
2)您需要构建某种LifeTimeManager字典,将LifeTimeManager实例与统一注册结合
3)使用UnityContainerExtension检查正在注册的类是“允许的”。如果不允许,请解析LifeTimeManager字典,获取类生命周期管理器并在其上调用“删除”。
这是UnityContainerExtension的基本示例:
public class UnityNavigationTrackerExtension : UnityContainerExtension
{
protected override void Initialize()
{
Context.Registering += ContextRegistering;
Context.RegisteringInstance += ContextRegisteringInstance;
}
private void ContextRegisteringInstance(object sender, RegisterInstanceEventArgs e)
{
var attributes =
e.Instance.GetType().GetCustomAttributes(typeof (MenuItemAttribute), true) as MenuItemAttribute[];
if (attributes != null)
foreach (MenuItemAttribute attribute in attributes)
{
RegisterMenuItemForView(e.RegisteredType, e.Instance.GetType(), attribute);
}
}
}
统一容器扩展所做的是允许你观察类注册的统一性。这意味着您可以在注册时进行交互。