我在.net 4.5中開發了一個Web應用程序,現在客戶要求我爲某些應用程序模塊(例如發票的不同實現)定製。 我的問題是我可以「攔截」我的客戶加載定製組裝併爲一般客戶加載不同的組裝?爲不同的客戶端加載不同的程序集或模塊
我可以簡單地通過反射嗎?
我在.net 4.5中開發了一個Web應用程序,現在客戶要求我爲某些應用程序模塊(例如發票的不同實現)定製。 我的問題是我可以「攔截」我的客戶加載定製組裝併爲一般客戶加載不同的組裝?爲不同的客戶端加載不同的程序集或模塊
我可以簡單地通過反射嗎?
關鍵的想法是設計軟件的方式可以很容易地更換其部件。您應該將解決方案分成多個項目,以便快速交換不同的接口實現。
此外,有一件事叫做依賴注入,它基本上意味着你可以根據你的需要在運行時或者使用一個配置文件的情況下注入不同的實現。爲了便於使用,已經爲您準備好了很好的框架,例如Ninject或Unity。
應用程序需要有堅實的架構來支持這種可能性。也許如果你提供了關於你的系統的更多信息,我可能會更具體,但我相信對依賴注入做一些研究會給你一個好的開始。
是的,你可以。您可以從文件加載程序集,如下所示: var asmbly = System.Reflection.Assembly.LoadFrom(path);
然後使用反射來加載類型。
有幾種方法可以實現這種可插拔性。一種方法是提取「模塊」的接口併爲您的「模塊客戶端」再次編寫接口,將具體實現與「客戶」代碼分離。然後,在運行時查看組件,加載實現所述接口的類型並注入「模塊客戶端」。
我在這裏粘貼一些代碼,我已經寫了作爲一個概念證明的exacly這種類型的「模塊」運行時裝載的(這是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));
...
注意,這類型的節目需要更多一點的權限 - 我對這個代碼已經幾年「生鏽」,但我記得與信任度的問題,當然,文件系統訪問有要考慮。
有框架可以幫助這樣的應用程序風格。這已經有幾年了,但過去在微軟的模式和實踐網站上有所謂的「複合應用程序塊」,它是兩個框架--Smart Cliet Softweare工廠和它的Web對等 - Web客戶端軟件工廠的基礎。他們有點重一些站起來,但爲這種模塊化(複合)應用提供了gread骨架。
我只是有一個單獨的解決方案,並使用ninject。我的問題是,如果應用程序是SaaS,我是否可以加載「模塊」的版本控制組件而無需爲我的客戶重新安裝單獨的應用程序? – TheNeXt
如果您已經在使用ninject,並且已經選擇了在外部文件而不是代碼中定義映射的路徑,那麼我相信這是可能的。只需將新的dll複製到應用程序文件夾並修改包含映射的ninject設置文件。試一試:)然而,如果你不能像這樣控制它,那麼我認爲它不會那麼容易,你必須修改核心文件才能實現。有可能(不太確定)攔截電話和東西的一些方法,但我不認爲這是一個好主意。 – walther