c#运行时丢失引用

时间:2018-01-10 10:49:38

标签: c# .net namespaces system.reflection

我将项目中的数据访问层分开,以便按国家/地区应用不同的验证规则。

例如我有一个界面" IVoucherService"

public interface IVoucherService
{
    void Foo();
}

在许多项目中实现

namespace VoucherHU
{
    [ApiLocalization(ApiLocalization.HU)]
    public class VoucherService : IVoucherService
    {
         public void Foo(){}
    }
}

namespace Voucher
{
    [ApiLocalization(ApiLocalization.US)]
    [ApiLocalization(ApiLocalization.DEFAULT)]
    public class VoucherService : IVoucherService
    {
         public void Foo(){}
    }
}

以下代码确定必须使用哪个类

private static Type GetServiceImplementedType<TService>() where TService : class
{
    Type serviceType = typeof(TService);
    IEnumerable<Type> types = AppDomain.CurrentDomain.GetAssemblies().SelectMany(s => s.GetTypes()).Where(p => !p.IsInterface && serviceType.IsAssignableFrom(p));

    Type serviceImplementedClass = null;
    foreach (Type type in types)
    {
        ApiLocalizationAttribute[] attributes = (ApiLocalizationAttribute[])type.GetCustomAttributes(typeof(ApiLocalizationAttribute), true);
        if (attributes != null && attributes.Count() > 0 && attributes.Any(a => a.Localization == Localization))
        {
            serviceImplementedClass = type;
            break;
        }
    }

    return serviceImplementedClass;
}

我在Global.asax中注册这些服务 - &gt; Application_Start方法。 发布后它工作正常,服务正常启动,但如果没有人使用该网站,IIS(可能保存资源)暂停服务,直到下一个请求。 当API尝试重新注册服务时,它找不到任何实现IVoucherService接口的类。

我在手表中手动检查了一下,我收到了以下错误

  

Services.Voucher.VoucherService错误CS0234:类型或命名空间   名称&#39;服务&#39;命名空间中不存在(你错过了吗?   装配参考?)

并且我为实现此接口的其他类获得了相同的错误。

知道为什么我放弃对这些文件(Services.dll,ServicesHU.dll)的引用?

1 个答案:

答案 0 :(得分:0)

我明白了。

不知何故,AppComaing.CurrentDomain.GetAssemblies()不再包含DLL文件的汇编信息。

解决方案是在Global.asax - &gt;每次刷新引用的程序集。 Application_Start方法调用。

要刷新引用的程序集,请使用此方法

System.Web.Compilation.BuildManager.GetReferencedAssemblies();