环境: .Net Core Ninject4
主要是因为 在开发.Net Core 相关项目的适合 Ninject4 的StandardKernel 类过时了(过时这种警告,我们都是不看的),所以重写了下Ioc 的实现
public static class Ioc
{
private static IReadOnlyKernel _readOnlyKernel;
static Ioc()
{
KernelConfiguration configuration = new KernelConfiguration(GetModules());
configuration.Settings.Set("InjectAttribute",typeof(DependencyAttribute));
_readOnlyKernel = configuration.BuildReadonlyKernel();
}
private static INinjectModule[] GetModules()
{
Assembly assembly = Assembly.Load(new AssemblyName(typeof(Ninject4Test.Ioc).Namespace));
INinjectModule[] modules = assembly.DefinedTypes
.Where(a => a.GetInterface(nameof(INinjectModule)) != null)
.Select(a=>(INinjectModule)assembly.CreateInstance(a.FullName)).ToArray();
return modules;
}
public static T Get<T>()
{
return _readOnlyKernel.Get<T>();
}
}
如果用 .Net Standard 的话,是没有System.Reflection.TypeExtensions 这个类库的,需要改改代码
public static class Ioc
{
private static IReadOnlyKernel _readOnlyKernel;
static Ioc()
{
KernelConfiguration configuration = new KernelConfiguration(GetModules());
configuration.Settings.Set("InjectAttribute", typeof(DependencyAttribute));
_readOnlyKernel = configuration.BuildReadonlyKernel();
}
private static INinjectModule[] GetModules()
{
Assembly assembly = Assembly.Load(new AssemblyName(typeof(DI.Ioc).Namespace));
INinjectModule[] modules = assembly.DefinedTypes
.Where(a => a.AsType().GetInterfaces().Contains(typeof(INinjectModule)))
.Select(a => (INinjectModule)Activator.CreateInstance(Type.GetType(a.FullName))).ToArray();
return modules;
}
public static T Get<T>()
{
return _readOnlyKernel.Get<T>();
}
}