Есть ли способ создать ILogger на основе имени класса, полученного посредством отражения параметров?
1 – Получить необходимые параметры
Код: Выделить всё
public static object CreateInstance(Type type, Assembly[] assemblies)
{
try
{
var constructor = type.GetConstructors().FirstOrDefault();
if (constructor == null)
{
throw new InvalidOperationException($"No public constructor found for type {type.FullName}");
}
var parameters = constructor.GetParameters();
var parameterInstances = parameters.Select(p => ResolveDependency(p.ParameterType, assemblies)).ToArray();
return constructor.Invoke(parameterInstances);
}
catch (Exception ex)
{
throw;
}
}
Код: Выделить всё
private static object ResolveDependency(Type type, Assembly[] assemblies)
{
if (type.Name.IndexOf("IMapper") > -1)
{
return AutoMapperConfig.GetMapper();
}
if (type.Name.IndexOf("ILogger") > -1)
{
try
{
var typeArg = type.GetGenericArguments()[0];
var entityType = FindTypeByName(typeArg.Name, assemblies);
return LoggerFactory.CreateLogger();
}
catch (Exception ex1)
{
throw;
}
}
foreach (var assembly in assemblies)
{
var implementationType = assembly.GetTypes().FirstOrDefault(t => type.IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract);
if (implementationType != null)
{
return CreateInstance(implementationType, assemblies);
}
}
throw new InvalidOperationException($"No implementation found for type {type.FullName}");
}
Код: Выделить всё
public static object CreateILogger(Type type)
{
var genericType = typeof(Logger).MakeGenericType(type);
return Activator.CreateInstance(genericType);
}
Код: Выделить всё
var myService = ServiceInitializer.Initialize(MyService);
Возможно, я выбрал неправильный подход к написанию тестов XUnit, ваши предложения очень нужны, просто имейте в виду, что я хочу избавьтесь от инициализации n числа классов для одного тестируемого сервиса.
Подробнее здесь: https://stackoverflow.com/questions/787 ... tializatio
Мобильная версия