WCF Servicefactory中的Assembly.LoadFrom(assemblypath)

时间:2013-08-01 21:18:28

标签: wcf reflection unity-container

我正在为我的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无法解析类型的异常......

1 个答案:

答案 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。当您使用LoadFileLoad(byte[])时,程序集将加载到Neither上下文中。在这两种情况下,没有使用AssemblyResolve,任何东西都无法绑定到程序集。

请参阅: