Asp.net mvc 4 了解foreach循环在AppDomain中查找的内容
我在翻阅几个月前下载的一个MVC示例,它遇到了一个使用Asp.net mvc 4 了解foreach循环在AppDomain中查找的内容,asp.net-mvc-4,foreach,Asp.net Mvc 4,Foreach,我在翻阅几个月前下载的一个MVC示例,它遇到了一个使用AppDomain.CurrentDomain的foreach循环。我希望有人能解释一下foreach循环在搜索什么 foreach (var assembly in AppDomain.CurrentDomain .GetAssemblies() .Where(a => a.GetName().Name.Contains("Spring"))) {
AppDomain.CurrentDomain
的foreach
循环。我希望有人能解释一下foreach循环在搜索什么
foreach (var assembly in AppDomain.CurrentDomain
.GetAssemblies()
.Where(a => a.GetName().Name.Contains("Spring")))
{
var configTypes = assembly
.GetTypes()
.Where(t => t.BaseType != null
&& t.IsClass
&& !t.IsAbstract
&& t.BaseType.IsGenericType
&& t.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>)
&& t.BaseType.GetGenericArguments().Any(ta => _modelInterfaceType.IsAssignableFrom(ta)));
foreach (var type in configTypes)
{
var entityType = type.BaseType.GetGenericArguments().Single();
var entityConfig = assembly.CreateInstance(type.FullName);
addMethod.MakeGenericMethod(entityType)
.Invoke(modelBuilder.Configurations, new object[] { entityConfig });
}
}
foreach(AppDomain.CurrentDomain中的变量程序集
.getAssemblys()
.Where(a=>a.GetName().Name.Contains(“Spring”))
{
var configTypes=程序集
.GetTypes()
.Where(t=>t.BaseType!=null
&&t.I类
&&!t.IsAbstract
&&t.BaseType.IsGenericType
&&t.BaseType.GetGenericTypeDefinition()==typeof(EntityTypeConfiguration)
&&t.BaseType.GetGenericArguments().Any(ta=>_modelInterfaceType.IsAssignableFrom(ta));
foreach(configTypes中的变量类型)
{
var entityType=type.BaseType.GetGenericArguments().Single();
var entityConfig=assembly.CreateInstance(type.FullName);
addMethod.MakeGenericMethod(entityType)
.Invoke(modelBuilder.Configurations,新对象[]{entityConfig});
}
}
我知道它在AppDomain.CurrentDomain.GetAssemblies
和中找到的每个程序集运行一次循环。Where()
只是一个过滤器,但我不确定过滤器是如何工作的,也不确定它在AppDomain
中搜索的数据
注意:我从来没有使用过AppDomain的
假设您了解什么是AppDomain以及它与ASP.NET的关系。
有关AppDomain.GetAssemblys方法的说明,请参阅
查询正在搜索加载到当前AppDomain中的程序集,以查找程序集名称包含“Spring”的任何位置
:应用程序框架
我假设示例中有一些功能取决于是否引用了Spring。要告诉你更多,我需要看到代码的其余部分
由@Matthew Verstraete编辑后#
好的,这要解释的代码多一点。
因此,对于每个Spring程序集(或者至少是名称中有“Spring”的程序集…),我们使用反射来查看类型。
我们想要的东西是:
-某事物的子类型(t.BaseType!=null
)
-不是值类型(t.IsClass
)
-是具体的(没有抽象,没有接口-!t.IsAbstract
),具有类型参数(t.BaseType.IsGenericType
)
-现在有意思了:我们正在寻找EntityTypeConfiguration
-其中,可以从泛型类型ta=>\u modelInterfaceType.IsAssignableFrom(ta))
一旦代码找到合适的类型,它将继续在ModelBuilder
上为每个创建的实例创建each()的实例
你正在挖掘的是 应用程序域(AppDomain
)只是一个运行.NET应用程序的沙箱环境。每个应用程序域都与其他应用程序域隔离,并且在大多数情况下(但不总是),单个进程=单个域
AppDomain.CurrentDomain
指包含当前正在执行的代码的应用程序域(并引用AppDomain.CurrentDomain
)GetAssemblies()
获取已加载到该域的所有程序集,即从System.Web.Mvc.dll上的mscorlib.dll到您引用的任何其他程序集
因此,循环会遍历加载到应用程序中的所有程序集(+应用程序自己的程序集),但会过滤到名称包含“Spring”
的程序集
LINQyforeach
本质上等同于:
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
if (!assembly.GetName().Name.Contains("Spring"))
{
continue;
}
// Do something
}
此类代码可用于通过反射查找程序集中的特定类型,例如插件、控制器(MVC本身使用类似代码查找控制器
类)等
在本例中,它正在寻找EntityTypeConfiguration
(例如EntityTypeConfiguration
)的具体实现,其中T
是从中存储的type
派生的类型
然后,它仍然通过反射执行与此调用等效的操作:
someclass.Add<SomeEntity>(
modelBuilder.Configurations,
new object[] { new EntityTypeConfiguration<SomeEntity>() }
);
someclass.Add(
modelBuilder.Configurations,
新对象[]{new EntityTypeConfiguration()}
);
(不确定它是Add
,但addMethod
指的是在代码的前一部分中通过反射找到的MethodInfo
,您还没有包括它-从该变量的名称来看,似乎该方法的名称是Add
)。感谢您的解释和指向动态模型的链接。我下载的示例包含一个DynamicDbContext,代码优先配置的链接讨论了示例使用的方法。这就是这个网站的目的,不是吗?