0

NHibernateプロジェクトに実装しているLuceneFTエンジンがあります。私がやろうとしていることの1つは、定期的なメンテナンスをサポートすることです。つまり、FTインデックスをクリーンアップし、永続化されたエンティティから再構築します。PopulateIndex<T>エンティティのタイプを導出し、フルテキストのインデックス付き列のプロパティ属性を検索して、それらをLuceneディレクトリに格納できるジェネリック静的メソッドを作成しました。IEnumerable<T>今の私の問題は、NHibernate側から強く型付けされたメソッドをどのように提供するかです。

public static void PopulateIndex<T>(IEnumerable<T> entities) where T : class
{
    var entityType = typeof(T);
    if (!IsIndexable(entityType)) return;

    var entityName = entityType.Name;           
    var entityIdName = string.Format("{0}Id", entityName);

    var indexables = GetIndexableProperties(entityType);

    Logger.Info(i => i("Populating the Full-text index with values from the {0} entity...", entityName));
    using (var analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30))
    using (var writer = new IndexWriter(FullTextDirectory.FullSearchDirectory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED))
    {
        foreach (var entity in entities)
        {
            var entityIdValue = entityType.GetProperty(entityIdName).GetValue(entity).ToString();
            var doc = CreateDocument(entity, entityIdName, entityIdValue, indexables);
            writer.AddDocument(doc);
        }
    }
    Logger.Info(i => i("Index population of {0} is complete.", entityName));
}

これは私にagitaを与えている方法です:

public void RebuildIndices()
{
    Logger.Info(i => i("Rebuilding the Full-Text indices..."));
    var entityTypes = GetIndexableTypes();

    if (entityTypes.Count() == 0) return;
    FullText.ClearIndices();
    foreach (var entityType in entityTypes)
    {
        FullText.PopulateIndex(
            _Session.CreateCriteria(entityType)
            .List()
            );
    }
}

これは強い型を返すように見えますList<T>が、そうではありません。どうすればその強く型付けされたリストを取得できますか、またはこれを行うための代替/より良い方法はありますか?

4

1 に答える 1

1

厳密に型指定されたリストを取得する場合は、ジェネリック パラメーターを指定する必要があります。2 つのオプションを提案できます。PopulateIndexタイプごとに直接呼び出すことを意味します。

public void RebuildIndexes()
{
    Logger.Info(i => i("Rebuilding the Full-Text indices..."));
    FullText.ClearIndices();
    FullText.PopulateIndex(LoadEntities<EntityA>());
    FullText.PopulateIndex(LoadEntities<EntityB>());
    ...
}

private IEnumerable<T> LoadEntities<T>()
{
    _Session.QueryOver<T>().List();
}

または、リフレクションを使用して PopulateIndex を呼び出すことができます。

public void RebuildIndices()
{
    Logger.Info(i => i("Rebuilding the Full-Text indices..."));
    var entityTypes = GetIndexableTypes();

    if (entityTypes.Count() == 0) return;
    FullText.ClearIndices();
    foreach (var entityType in entityTypes)
    {
        var entityList = _Session.CreateCriteria(entityType).List();
        var populateIndexMethod = typeof(FullText).GetMethod("PopulateIndex", BindingFlags.Public | BindingFlags.Static);
        var typedPopulateIndexMethod = populateIndexMethod.MakeGenericMethod(entityType);
        typedPopulateIndexMethod.Invoke(null, new object[] { entityList });
    }
}
于 2013-03-02T15:51:23.657 に答える