1

数か月前にダウンロードした MVC の例を掘り下げていたところforeachAppDomain.CurrentDomain. 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 });
            }
        }

で見つかったアセンブリごとにループを 1 回実行することは理解していますがAppDomain.CurrentDomain.GetAssemblies.Where()は単なるフィルターですが、そのフィルターがどのように機能しているか、 で検索しているデータはよくわかりませんAppDomain

注: 私はこのAppDomain関数を使用したことがなく、その仕組みがよくわかりません。

4

2 に答える 2

2

AppDomains について少し読む価値があるかもしれません。
AppDomain とは何か、そしてそれが ASP.NET にどのように関連するかを理解していると仮定しましょう。AppDomain.GetAssemblies メソッドの説明については、このリンク
を 参照してください。

クエリは、現在の AppDomain に読み込まれたアセンブリを検索して、アセンブリの名前に "Spring" が含まれている場所を見つけます。

Spring : アプリケーション フレームワーク。

サンプルには、Spring が参照されているかどうかに依存する機能がいくつかあると思います。これ以上説明するには、残りのコードを確認する必要があります。

@Matthew Verstraeteによる編集後#

OK、それは説明するためにもう少しコードです。
そのため、各 Spring アセンブリ (または、少なくとも名前に「Spring」が含まれるアセンブリ...) について、リフレクションを使用して型を調べています。 - 何かのサブタイプ( ) - 値型ではない ( ) - 具象的 (abstract もインターフェイスもなし - )、型パラメーターを持っている ( ) - 興味深いことに、次のサブクラスを探してい
ます -私たちの一部のメンバーは、ジェネリック型から割り当てることができます
t.BaseType != null
t.IsClass
!t.IsAbstractt.BaseType.IsGenericType
EntityTypeConfiguration<>
ta => _modelInterfaceType.IsAssignableFrom(ta))

コードが適切なタイプを見つけたら、作成されたインスタンスごとにジェネリック メソッド(も参照) を呼び出して、それぞれのインスタンスを作成し続けます。ModelBuilder

あなたが掘り下げているのは、エンティティフレームワークのコードファースト構成です

于 2013-08-10T20:40:43.813 に答える
0

アプリケーション ドメイン ( AppDomain) は、単に .NET アプリケーションが実行されるサンドボックス環境です。各アプリケーション ドメインは他のドメインから分離されており、ほとんどの場合、常にではありませんが、1 つのプロセス = 1 つのドメインです。

AppDomain.CurrentDomainは、現在実行中の(および を参照している)コードを含むアプリケーション ドメインを参照しAppDomain.CurrentDomainます。GetAssemblies()そのドメインにロードされたすべてのアセンブリを取得します。つまり、mscorlib.dll から System.Web.Mvc.dll まで、参照した他のアセンブリまですべてを取得します。

そのため、ループはアプリケーションにロードされたすべてのアセンブリ (+ アプリケーション独自のアセンブリ) を通過しますが、名前に が含まれるアセンブリにフィルター処理されます"Spring"

LINQyforeachは基本的に次のものと同等です。

foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
   if (!assembly.GetName().Name.Contains("Spring"))
   {
      continue;
   }
   // Do something
}

この種のコードは、たとえば、リフレクションによってアセンブリ内の特定のタイプを見つけるために使用できます。たとえば、プラグイン、コントローラー (MVC 自体がControllerクラスを見つけるために同様のコードを使用します) などです。

EntityTypeConfiguration<T>この場合、 (たとえばEntityTypeConfiguration<SomeEntity>)の具体的な実装を探しています。ここで、 は格納されているTから派生した型です。Type_modelEntityInterface

次に、引き続きリフレクションを介して、この呼び出しと同等の処理を行います。

someclass.Add<SomeEntity>(
   modelBuilder.Configurations, 
   new object[] { new EntityTypeConfiguration<SomeEntity>() }
);

(確かではありませんが、コードの前の部分でリフレクションによって見つかっAddたものaddMethodを参照してMethodInfoいますが、これは含まれていません-その変数の名前から、メソッドの名前はおそらくそうですAdd)。

于 2013-08-10T20:47:55.010 に答える