0

UnityとPrismV4を使用して.NETのモジュラーアプリケーションに取り組んでいます。モジュラー設計の利点は、機能を簡単に追加および削除できることです。特定の機能を追加または除外するバージョンのアプリケーションを作成できることが要件です。PrismとUnityを使用して、必要な機能のアセンブリ(.dllファイル)をロードすることでこれを行うことができます。機能全体をきれいかつ正確に除外できるので、これが好きです。

私は、私たち自身の責任のために、アプリケーションのいくつかのバージョンに絶対に含まれてはならない特定の機能を持っています。ユーザーが別のユーザーの.DLLファイルを自分のディレクトリにコピーしてその機能を利用できないようにしたい。同様の懸念を持つ他の人々は、追加製品へのアップグレードとして「プラグインモジュール」を販売し、アドオンを購入した人へのアクセスを制限することに興味があるかもしれません。これは私たちが行っていることではありませんが、完全に排除されるべきではありません。

現在、PrismとUnityを使用すると、モジュールカタログを登録する方法が複数あります。たとえば、コード、ディレクトリ、アプリケーション構成XMLファイルから、または独自の方法でモジュールカタログを作成できます。最も簡単な方法の1つは、アプリケーションのシェルが各アセンブリを参照し、コードがその構成のアセンブリファイルを具体的にロードすることです。これにより、他の誰かからファイルをコピーしてその機能を取得することが少し難しくなります。ただし、構成の誤りが発生したり、より汎用的な「アドオン」シナリオが妨げられたりする可能性があります(つまり、機能を含めるためにアプリケーションシェルを再コンパイルする必要があります)。

ロードするアセンブリをハードコーディングする場合、ロードするモジュールを決定するために、ビルド環境変数で#ifdefを実行する必要があります。これは、誰かがシェル実行可能ファイルと追加のライブラリを取得した場合にファイルをコピーすることを実際に妨げるものではありません。また、特定のビルドを追跡してさまざまなインストーラープロジェクトに参加することはより困難であり、購入したアドオンシナリオを防ぐことができます。私には、アプリケーションのシェルがモジュールを直接参照する必要がない場合に最適と思われます。たぶん、特定の場所からアセンブリをロードすることはできますが、ユーザーがそのモジュールにアクセスできるはずであることを、プロダクトキーなどで確認することができます。

モジュールのライセンスを取得する方法や、モジュールへのアクセスをアプリケーションのさまざまなユーザー(バージョン)に制限する方法についての経験や洞察を持っている人がいるかどうかに興味があります。基本的なアプリケーションは完全に無料で、ライセンスは必要ありません。おそらく絶対確実なものはありませんが、誰かがシステムを簡単に回避できないように最善を尽くす必要があります。もう1つの要件は、ユーザーにインターネットアクセスを要求できるとは思わないことです(これを要求する何らかのライセンス方法があった場合)。もちろん、これが.NET、Prism、Unityの議論に限定されているかどうかはわかりませんが、それがこのプロジェクトで使用しているものです。

強力なキー名を使用して各アセンブリに署名すると、モジュールが信頼できるソースからのものであることを確認するのに役立ちますが、それがライセンスに役立つかどうかはわかりません。たぶん、どのモジュールが許可されたかを示すために使用できるプロダクトキーシステムがありますか?とにかく、私はこの問題を解決するアプローチについてオープンマインドであり、特定のアイデアやパスに沿って議論を集中したくないので、そこで止まります。

よろしくお願いします。

4

1 に答える 1

1

私はこれが以下を使用して行うことができると思います:

1)Unityで取得する通常のLifeTimeManagerを拡張します。これらは、オブジェクトがいつ破棄されるかを制御し、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);
                }
        }
    }

Unityコンテナー拡張機能は、クラスがUnityに登録されるのを監視できるようにします。これは、登録が発生したときにそれを操作できることを意味します。

于 2012-10-11T08:27:56.803 に答える