0

我正在使用 Unity 和 Prism V4 开发 .NET 中的模块化应用程序。具有模块化设计的一个优势是能够轻松添加和删除功能。我必须能够创建添加或排除某些功能的应用程序版本。使用 Prism 和 Unity,我可以通过加载所需功能的程序集(.dll 文件)来做到这一点。我喜欢这个,因为它允许我干净、准确地排除整个功能。

我有某些功能绝对不能包含在某些版本的应用程序中,这是我们自己的责任。我想阻止用户将另一个用户的 .DLL 文件复制到他的目录中以获得该功能。其他有类似担忧的人可能有兴趣出售“插件模块”作为附加产品的升级,并限制购买附加组件的人访问。这不是我们正在做的事情,但也不能完全排除。

现在,使用 Prism 和 Unity 有多种方法可以注册模块目录,包括在代码中、从目录、从应用程序配置 XML 文件,或者您可以自己编写。最简单的方法之一是让应用程序的外壳引用每个程序集,并且代码专门为该配置加载程序集文件。这确实使简单地从其他人那里复制文件并获得该功能变得稍微困难​​一些。但是,我担心它可能会导致配置错误,或者阻止更通用的“附加”场景(即您需要重新编译应用程序外壳以包含功能)。

如果我对要加载的程序集进行硬编码,我可能必须在构建环境变量上使用#ifdef 来确定应该加载哪些模块。如果他们获取 shell 可执行文件和其他库,这并不能真正阻止某人复制文件。跟踪特定构建以进入不同的安装程序项目并阻止购买的附加方案似乎也更加困难。对我来说,最好是应用程序的外壳不需要直接引用模块。也许,它可以从特定位置加载程序集,但可以通过产品密钥或其他地方以某种方式验证用户应该有权访问该模块。

如果有人对如何许可模块或将模块的访问权限限制为应用程序的不同用户(版本)有经验或见解,我很感兴趣。基本应用程序可能完全免费,不需要许可证。可能没有什么是万无一失的,但我需要尽我最大的努力让别人绕过这个系统变得不容易。另一个要求是我不相信我可以要求我的用户能够访问互联网(如果有某种许可方法需要这样做)。当然,我不确定这不仅限于对 .NET、Prism 或 Unity 的讨论,但这就是我在这个项目中使用的。

使用强密钥名称对每个程序集进行签名可以帮助我验证模块是否来自受信任的来源,但我不确定这对许可是否有帮助。也许有一个可以使用的产品密钥系统来指示允许哪些模块?无论如何,我会停在那里,因为我对解决这个问题的任何方法持开放态度,我不想将讨论集中在一个特定的想法或路径上。

提前感谢您的帮助。

4

1 回答 1

1

我认为这可以使用以下方法来完成:

1) 扩展您在 Unity 中获得的正常 LifeTimeManagers。这些用于控制何时处理对象并允许您从 Unity 中删除注册

如何使用 LifeTimeManager 从 Unity 中删除项目:StackOverflow 答案

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);
                }
        }
    }

unity 容器扩展的作用是让您看到类注册到 unity。这意味着您可以在注册发生时与它们进行交互。

于 2012-10-11T08:27:56.803 回答