私は .net 4.5 で Web アプリケーションを開発しましたが、顧客からアプリケーションの一部のモジュールのカスタマイズを依頼されました (たとえば、請求書の別の実装)。私の質問は、カスタマイズされたアセンブリをロードするために顧客を「傍受」し、一般の顧客のために別のアセンブリをロードすることはできますか?
私は単に反射によってそれを行うことができますか?
私は .net 4.5 で Web アプリケーションを開発しましたが、顧客からアプリケーションの一部のモジュールのカスタマイズを依頼されました (たとえば、請求書の別の実装)。私の質問は、カスタマイズされたアセンブリをロードするために顧客を「傍受」し、一般の顧客のために別のアセンブリをロードすることはできますか?
私は単に反射によってそれを行うことができますか?
重要なアイデアは、パーツを簡単に交換できるようにソフトウェアを設計することです。インターフェイスのさまざまな実装をすばやく交換できるように、ソリューションを複数のプロジェクトに分割する必要があります。
さらに、依存性注入と呼ばれるものがあります。これは基本的に、実行時または構成ファイルを使用して、ニーズに応じて異なる実装を注入できることを意味します。使いやすさのために、Ninject や Unity などの優れたフレームワークが用意されています。
アプリケーションには、そのような可能性をサポートするための堅牢なアーキテクチャが必要です。お使いのシステムについてより多くの情報を提供していただければ、より具体的な情報を提供できたかもしれませんが、依存性注入に関する調査を行うことは、良い出発点になると思います。
はい、できます。このように、ファイルからアセンブリをロードしてから、
var asmbly = System.Reflection.Assembly.LoadFrom(path);
リフレクションを使用して型をロードできます。
このプラグ可能性を実現するには、いくつかの方法があります。1 つの方法は、「モジュール」のインターフェイスを抽出し、そのインターフェイスに対して「モジュール クライアント」をコーディングして、具体的な実装を「クライアント」コードから分離することです。次に、実行時にアセンブリ内を調べ、上記のインターフェイスを実装する型をロードし、「モジュール クライアント」に挿入します。
「モジュール」の実行時ロードの正確なタイプの概念実証として作成したコードをここに貼り付けます (これは MVC 3 です)。
// "Module User" was decoupled from "module", by coding it against module's interface:
public class CustomerController : Controller
{
private ICustomerRepository _customerRepository;
// dependency injection constructor
public CustomerController(
...
ICustomerRepository customerRepository,
...)
{
_customerRepository = customerRepository;
}
public ActionResult Details(Nullable<Guid> id)
{
Customer c = _customerRepository.GetByKey(id.Value.ToString());
...
}
...
}
実行時:
// I first load the assembly
System.Reflection.Assembly dal = System.Reflection.Assembly.LoadFrom(System.IO.Path.Combine(pBinPath, pDALAssemblyName));
// I then look for types implementing ICustomerRepository
var addressRepositoryContract = typeof(QSysCamperCore.Domain.IAddressRepository);
var addressRepositoryImplementation = dal.GetTypes()
.First(p => addressRepositoryContract.IsAssignableFrom(p));
...
このタイプのプログラミングには、もう少しパーミッションが必要であることに注意してください。私はすでにこのコードに数年「慣れていません」ですが、信頼レベルの問題を覚えています。もちろん、ファイル システムへのアクセスも考慮する必要があります。
このようなアプリケーション スタイルを支援するフレームワークがあります。これも数年前のことですが、Microsoft の Patterns and Practices サイトにはいわゆる「複合アプリケーション ブロック」がありました。これは 2 つのフレームワーク (Smart Cliet Softweare Factory とその Web 版である Web Client Software Factory) のベースでした。それらは立つのが少し重かったが、そのようなモジュール化された (複合) アプリケーションのための優れた骨組みを提供した.