我将项目中的数据访问层分开,以便按国家/地区应用不同的验证规则。
例如我有一个界面" 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)的引用?
答案 0 :(得分:0)
不知何故,AppComaing.CurrentDomain.GetAssemblies()
不再包含DLL文件的汇编信息。
解决方案是在Global.asax - &gt;每次刷新引用的程序集。 Application_Start方法调用。
要刷新引用的程序集,请使用此方法
System.Web.Compilation.BuildManager.GetReferencedAssemblies();