Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 4 了解foreach循环在AppDomain中查找的内容_Asp.net Mvc 4_Foreach - Fatal编程技术网

Asp.net mvc 4 了解foreach循环在AppDomain中查找的内容

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"))) {

我在翻阅几个月前下载的一个MVC示例,它遇到了一个使用
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”
的程序集

LINQy
foreach
本质上等同于:

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,代码优先配置的链接讨论了示例使用的方法。这就是这个网站的目的,不是吗?