2013-08-01 60 views
2

我正在爲我的wcf服務使用WCF ServicehostFactory,並使用接口爲服務和存儲庫/ DAL實例化提供統一。WCF Servicefactory中的Assembly.LoadFrom(程序集路徑)

我想將程序集加載到我的appdomain中(在實例化服務之前),其類型在我的web.config中爲Unity DI註冊。

<assembly name="Customer.DAL.AdventureWorks"/> 
<assembly name="Customer.DAL.Blogger"/> 
<assembly name="Customer.Interfaces"/> 
<assembly name="Customer.DAL"/> 
<namespace name="Customer.Interfaces.Repository"/> 
<namespace name="Customer.DAL.AdventureWorks"/> 
<namespace name="Customer.DAL.Blogger"/> 
<container> 
    <register type="Customer.Interfaces.DAL.IDal, Customer.Interfaces" mapTo="Customer.DAL.API, Customer.DAL"> 
    <lifetime type="transient"/> 
    </register> 
    <register type="Customer.Interfaces.Repository.IRepositoryDepartment, Customer.Interfaces" mapTo="Customer.DAL.AdventureWorks.RepositoryDepartment, Customer.DAL.AdventureWorks"> 
    <lifetime type="transient"/> 
    </register> 
    <register type="Customer.Interfaces.Repository.IRepositoryBlogs, Customer.Interfaces" mapTo="Customer.DAL.Blogger.RepositoryBlogs, Customer.DAL.Blogger"> 
    <lifetime type="transient"/> 
    </register> 
</container> 

,我使用以下代碼來加載組件:

Assembly.LoadFile("C:\xxxxx\Customer.DAL.dll"); // loaded from somewhere on disk. 

我已驗證逆水程序域的加載組件的存在和該組件被成功加載。 之後立即嘗試使用統一註冊服務類型,但我得到以下例外: 無法解析類型名稱或別名Customer.DAL.API,Customer.DAL。請檢查您的配置文件並驗證此類型的名稱。

那麼爲什麼類型「Customer.DAL.API」不能解決?

編輯:我並行運行FusionLog並找出失敗的程序集綁定。 爲什麼它實際上搜索程序集,導致這個程序集已經被我用上面提到的反射加載?!

EDIT-II: @Tuzo: 我閱讀了您發佈的所有文章。 而且試過如下:

static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 

      AssemblyName asname = AssemblyName.GetAssemblyName(@"C:\xxxx\KM_Solution\Customer.DAL\bin\Debug\Customer.DAL.dll");     
      return Assembly.Load(asname);    

    } 

但我仍然得到例外。我檢查了AppDomain.CurrentDomain.GetAssemblies(),我可以找到我的程序集,但仍然會拋出Unity無法解析類型的異常...

+0

好吧,當我改變輸出路徑的dll到我的WCF SVC的bin路徑那麼它就行得通,但這不是我問題的答案。 爲什麼Unity在程序集已經加載到當前appdomain的時候在某處搜索它。 Unity不檢查程序集是否已經加載... – Legends

+0

也許'Customer.DAL.dll'還有其他未解決的依賴關係? –

回答

1

如果需要,我會處理AssemblyResolve事件並加載程序集:

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 
IUnityContainer container = new UnityContainer() 
    .LoadConfiguration(); 

// Example of resolving without hard reference 
var customerDal = container.Resolve(
    Type.GetType("Customer.Interfaces.Repository.IRepositoryDepartment, Customer.Interfaces")); 


private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    string assemblyName = @"C:\xxxxx\" + args.Name + ".dll"; 

    if (File.Exists(assemblyName)) 
    { 
     return Assembly.LoadFile(assemblyName); 
    } 

    return null; 
} 

根據爲什麼LoadFile不起作用,原因是負載上下文。有3個上下文:Load,LoadFrom和Both。當您使用LoadFileLoad(byte[])時,程序集將加載到Neither上下文中。在這兩種情況下,沒有使用AssemblyResolve沒有任何東西可以綁定到程序集。

參見:

+0

我只是測試這個,你的方法將是推薦的方式,但它不回答我的問題;-) – Legends