我正在为我的wcf服务使用WCF ServicehostFactory,并使用接口对服务和存储库/ DAL实例化进行统一。
我想将程序集加载到我的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.
我已经验证了当前appdomain是否存在已加载的程序集,并且已成功加载程序集。 紧接着,我尝试使用unity注册服务类型,但是我得到以下异常: 无法解析类型名称或别名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 :(得分: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和Nither。当您使用LoadFile
或Load(byte[])
时,程序集将加载到Neither上下文中。在这两种情况下,没有使用AssemblyResolve
,任何东西都无法绑定到程序集。
请参阅: