У меня типичное 3-уровневое .NET-приложение.
Уровень домена не ссылается на другие проекты.
Уровень доступа к данным ссылается на уровень домена и реализует некоторые репозитории.
Уровень веб-просмотра использует службы уровня домена и управляет Autofac (контейнер IOC).
Уровни доступа к домену и данным реализуют модули Autofac. Это означает, что из уровня веб-просмотра я могу сканировать все сборки и регистрировать их в Autofac, чтобы обеспечить внедрение зависимостей.
Я не хочу, чтобы мой Web View Layer знал или заботился о том, какой уровень доступа к данным используется, поэтому я не хочу включать ссылку на него. Однако, если я не ссылаюсь на уровень доступа к данным, сканирование, чтобы найти сборки, не обнаружит его.
Вот метод запуска, который вызывается на уровне веб-представления:
private static void RegisterAutofacAssemblyModules(ContainerBuilder builder)
{
IEnumerable<Assembly> assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(x => x.FullName.Contains("Boutique"));
if (HostingEnvironment.InClientBuildManager)
{
assemblies = assemblies.Union(BuildManager.GetReferencedAssemblies().Cast<Assembly>()).Distinct();
}
builder.RegisterAssemblyModules(assemblies.ToArray());
}
Я добавил .Where (), чтобы надеяться улучшить производительность, так как нужно будет сканировать меньше сборок. (Не уверен, правда это или нет).
И этот код прекрасно работает, если я ссылаюсь на уровень доступа к данным (на уровне веб-представления). Но я не хочу, чтобы уровень веб-представления ссылался на уровень доступа к данным. Итак, как я могу отсканировать сборку, чтобы убедиться, что уровень доступа к данным включен? Я хотел бы просто получить все сборки в решении, если это возможно.