2

我将 WCF ServicehostFactory 用于我的 wcf 服务,并结合使用统一的服务和存储库/DAL 实例化接口。

我想将一个程序集加载到我的 appdomain 中(在实例化服务之前),其类型已在我的 web.config for 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 无法解析类型的异常...

4

1 回答 1

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 不起作用,原因是 Load Context。有 3 个上下文:Load、LoadFrom 和 Never。当您使用LoadFileLoad(byte[])然后程序集被加载到两个上下文中。在这两种情况下,如果不使用AssemblyResolve.

看:

于 2013-08-02T07:23:43.073 回答