Skip to content

Commit

Permalink
Adds DI extensions, gets website booting
Browse files Browse the repository at this point in the history
  • Loading branch information
Shazwazza committed May 1, 2021
1 parent eb9190e commit 205e06f
Show file tree
Hide file tree
Showing 61 changed files with 228 additions and 257 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
dotnet-version: ['3.1.x', '5.0.x' ]
dotnet-version: [ '5.0.x' ]

env:
Solution_File: src/Examine.sln
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,4 @@ src/packages/*
/src/Examine.Web.Demo/_bin_deployableAssemblies/*
/src/Examine.Web.Demo/App_Data/*
.idea/
/src/Examine.Web.Demo/Examine/*
19 changes: 13 additions & 6 deletions src/Examine.Core/ExamineManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,17 @@ namespace Examine
///</summary>
public class ExamineManager : IDisposable, IExamineManager
{
public ExamineManager()
{
public ExamineManager(IEnumerable<IIndex> indexes, IEnumerable<ISearcher> searchers)
{
foreach(IIndex i in indexes)
{
AddIndex(i);
}

foreach(ISearcher s in searchers)
{
AddSearcher(s);
}
}

private readonly ConcurrentDictionary<string, IIndex> _indexers = new ConcurrentDictionary<string, IIndex>(StringComparer.InvariantCultureIgnoreCase);
Expand All @@ -31,8 +40,7 @@ public bool TryGetIndex(string indexName, out IIndex index) =>
/// <inheritdoc />
public IEnumerable<IIndex> Indexes => _indexers.Values;

/// <inheritdoc />
public IIndex AddIndex(IIndex index)
private IIndex AddIndex(IIndex index)
{
//make sure this name doesn't exist in
if (!_indexers.TryAdd(index.Name, index))
Expand All @@ -43,8 +51,7 @@ public IIndex AddIndex(IIndex index)
return index;
}

/// <inheritdoc />
public ISearcher AddSearcher(ISearcher searcher)
private ISearcher AddSearcher(ISearcher searcher)
{
//make sure this name doesn't exist in
if (!_searchers.TryAdd(searcher.Name, searcher))
Expand Down
16 changes: 2 additions & 14 deletions src/Examine.Core/IExamineManager.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;

namespace Examine
Expand All @@ -21,18 +21,6 @@ public interface IExamineManager
/// </remarks>
IEnumerable<ISearcher> RegisteredSearchers { get; }

/// <summary>
/// Adds an indexer to the manager
/// </summary>
/// <param name="index"></param>
IIndex AddIndex(IIndex index);

/// <summary>
/// Adds an index searcher to the manager - generally this would be a multi index searcher since most searchers are created from an existing index
/// </summary>
/// <param name="searcher"></param>
ISearcher AddSearcher(ISearcher searcher);

void Dispose();

/// <summary>
Expand All @@ -54,4 +42,4 @@ public interface IExamineManager
bool TryGetSearcher(string searcherName, out ISearcher searcher);

}
}
}
151 changes: 150 additions & 1 deletion src/Examine.Host/ServicesCollectionExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,165 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Examine.Lucene.Directories;
using Microsoft.AspNetCore.DataProtection;
using Examine.Lucene.Providers;
using Microsoft.Extensions.DependencyInjection;

namespace Examine
{

public static class ServicesCollectionExtensions
{

/// <summary>
/// Registers a file system based Lucene Examine index
/// </summary>
/// <typeparam name="TIndex"></typeparam>
/// <typeparam name="TDirectoryFactory"></typeparam>
/// <param name="serviceCollection"></param>
/// <param name="name"></param>
/// <param name="directory"></param>
/// <returns></returns>
public static IServiceCollection AddExamineLuceneIndex<TIndex>(
this IServiceCollection serviceCollection,
string name,
DirectoryInfo directory)
where TIndex : IIndex
=> serviceCollection.AddTransient<IIndex>(services =>
{
IDirectoryFactory dirFactory = services.GetRequiredService<FileSystemDirectoryFactory>();
global::Lucene.Net.Store.Directory dir = dirFactory.CreateDirectory(directory);

TIndex index = ActivatorUtilities.CreateInstance<TIndex>(
services,
name,
dir);

return index;
});

/// <summary>
/// Registers an Examine index
/// </summary>
/// <typeparam name="TIndex"></typeparam>
/// <typeparam name="TDirectoryFactory"></typeparam>
/// <param name="serviceCollection"></param>
/// <param name="name"></param>
/// <param name="directory"></param>
/// <returns></returns>
public static IServiceCollection AddExamineLuceneIndex<TIndex, TDirectoryFactory>(
this IServiceCollection serviceCollection,
string name,
DirectoryInfo directory)
where TIndex : IIndex
where TDirectoryFactory : IDirectoryFactory
=> serviceCollection.AddTransient<IIndex>(services =>
{
TDirectoryFactory dirFactory = services.GetRequiredService<TDirectoryFactory>();
global::Lucene.Net.Store.Directory dir = dirFactory.CreateDirectory(directory);

TIndex index = ActivatorUtilities.CreateInstance<TIndex>(
services,
name,
dir);

return index;
});

/// <summary>
/// Registers an Examine index
/// </summary>
/// <typeparam name="TIndex"></typeparam>
/// <param name="serviceCollection"></param>
/// <param name="name"></param>
/// <param name="parameterFactory">
/// A factory to fullfill the custom index construction parameters excluding the name that are not already registerd in DI.
/// </param>
/// <returns></returns>
public static IServiceCollection AddExamineIndex<TIndex>(
this IServiceCollection serviceCollection,
string name,
Func<IServiceProvider, IList<object>> parameterFactory)
where TIndex : IIndex
=> serviceCollection.AddTransient<IIndex>(services =>
{
IList<object> parameters = parameterFactory(services);
parameters.Insert(0, name);

TIndex index = ActivatorUtilities.CreateInstance<TIndex>(
services,
parameters.ToArray());

return index;
});

/// <summary>
/// Registers a standalone Examine searcher
/// </summary>
/// <typeparam name="TSearcher"></typeparam>
/// <param name="serviceCollection"></param>
/// <param name="name"></param>
/// <param name="parameterFactory">
/// A factory to fullfill the custom searcher construction parameters excluding the name that are not already registerd in DI.
/// </param>
/// <returns></returns>
public static IServiceCollection AddExamineSearcher<TSearcher>(
this IServiceCollection serviceCollection,
string name,
Func<IServiceProvider, IList<object>> parameterFactory)
where TSearcher : ISearcher
=> serviceCollection.AddTransient<ISearcher>(services =>
{
IList<object> parameters = parameterFactory(services);
parameters.Insert(0, name);

TSearcher searcher = ActivatorUtilities.CreateInstance<TSearcher>(
services,
parameters.ToArray());

return searcher;
});

/// <summary>
/// Registers a lucene multi index searcher
/// </summary>
/// <param name="serviceCollection"></param>
/// <param name="name"></param>
/// <param name="indexNames"></param>
/// <returns></returns>
public static IServiceCollection AddExamineLuceneMultiSearcher(
this IServiceCollection serviceCollection,
string name,
string[] indexNames)
=> serviceCollection.AddTransient<ISearcher>(services =>
{
IEnumerable<IIndex> matchedIndexes = services.GetServices<IIndex>()
.Where(x => indexNames.Contains(x.Name));

var parameters = new List<object>
{
name,
matchedIndexes
};

var searcher = ActivatorUtilities.CreateInstance<MultiIndexSearcher>(
services,
parameters.ToArray());

return searcher;
});

/// <summary>
/// Adds the Examine core services
/// </summary>
/// <param name="services"></param>
/// <returns></returns>
public static IServiceCollection AddExamine(this IServiceCollection services)
{
services.AddSingleton<IExamineManager, ExamineManager>();
services.AddSingleton<IApplicationIdentifier, AspNetCoreApplicationIdentifier>();
services.AddSingleton<ILockFactory, DefaultLockFactory>();
services.AddSingleton<SyncMutexManager>();
services.AddSingleton<SyncTempEnvDirectoryFactory>();
services.AddSingleton<TempEnvDirectoryFactory>();
Expand Down
6 changes: 6 additions & 0 deletions src/Examine.Web.Demo/Examine.Web.Demo.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@
<TargetFramework>net5.0</TargetFramework>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Examine\**" />
<Content Remove="Examine\**" />
<EmbeddedResource Remove="Examine\**" />
<None Remove="Examine\**" />
</ItemGroup>
<ItemGroup>
<Content Update="Web.config">
<SubType>Designer</SubType>
Expand Down
37 changes: 37 additions & 0 deletions src/Examine.Web.Demo/IndexFactoryExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using System.IO;
using Examine.Lucene.Directories;
using Examine.Lucene.Providers;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;

namespace Examine.Web.Demo
{
/// <summary>
/// Creates the indexes
/// </summary>
public static class IndexFactoryExtensions
{
public static IServiceCollection CreateIndexes(
this IServiceCollection services,
IWebHostEnvironment env)
{
services.AddExamineLuceneIndex<LuceneIndex>(
"Simple2Indexer",
new DirectoryInfo(
Path.Combine(
env.ContentRootPath, "Examine", "Simple2Indexer")));

services.AddExamineLuceneIndex<LuceneIndex>(
"SecondIndexer",
new DirectoryInfo(
Path.Combine(
env.ContentRootPath, "Examine", "SecondIndexer")));

services.AddExamineLuceneMultiSearcher(
"MultiIndexSearcher",
new[] { "Simple2Indexer", "SecondIndexer" });

return services;
}
}
}
13 changes: 9 additions & 4 deletions src/Examine.Web.Demo/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,14 @@ public static void Main(string[] args)

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.AddConsole();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
Loading

0 comments on commit 205e06f

Please sign in to comment.