3
How can I log all my validation classes using Dryioc dynamically ?
I’m trying this way down;
using DryIoc;
using FluentValidation;
using System;
using System.Linq;
using System.Reflection;
namespace TesteDryIoC.IU
{
class Program
{
private static Type[] GetTypesInNamespace()
{
return Assembly.GetExecutingAssembly().GetTypes().Where(t => String.Equals(t.Namespace, "TesteDryIoC.IU.Validator", StringComparison.Ordinal)).ToArray();
}
static void Main(string[] args)
{
var container = new Container();
var implementingClasses =
Assembly.GetExecutingAssembly()
.GetTypes().Where(type => String.Equals(type.Namespace, "TesteDryIoC.IU.Validator", StringComparison.Ordinal) &&
type.Name.EndsWith("Validator"));
foreach (var implementingClass in implementingClasses)
{
container.Register(implementingClass, Reuse.Singleton);
}
Cliente cliente = new Cliente();
var validador = new ProvaderValidator<Cliente>().GetValidator(container);
cliente.Nome = "";
cliente.SobreNome = "Souza";
cliente.Observacao = "teste";
cliente.Email = "[email protected]";
cliente.Idade = 32;
cliente.DtInclusao = DateTime.Now;
cliente.Ativo = true;
cliente.Senha = "";
var resultad0 = validador.Validate(cliente);
foreach (var item in resultad0.Errors)
{
Console.WriteLine(item.ErrorMessage);
}
Console.WriteLine("--------------------------------------");
Console.ReadKey();
}
}
}
My validation classes always end with Validator as shown below.
using FluentValidation;
namespace TesteDryIoC.IU.Validator
{
class ProdutoValidator : AbstractValidator<Produto>
{
public ProdutoValidator()
{
RuleFor(x => x.Nome)
// Garante que a propriedade especificada não seja nula
.NotNull().WithMessage("{PropertyName} deve ser preenchido");
}
}
}
Product class;
namespace TesteDryIoC.IU
{
public class Produto
{
public string Nome { get; set; }
}
}
Generic class to register.
using DryIoc;
using FluentValidation;
namespace TesteDryIoC.IU
{
public class ProvaderValidator<T> where T : class
{
public IValidator GetValidator(Container container)
{
var validador = container.Resolve<IValidator<T>>();
return validador;
}
}
}
The problem here is that when you get in line var validador = container.Resolve<IValidator<T>>();
it returns the following error;
Dryioc.Containerexception: 'Unable to resolve Ivalidator
Where no service registrations found and no Dynamic registrations found in 0 Rules.Dynamicserviceproviders and Nothing in 0 Rules.Unknownserviceresolvers'
The error with more details;
Dryioc.Containerexception occurred Hresult=0x80131509
Message=Unable to resolve Ivalidator Where no service registrations found and no Dynamic registrations found in 0 Rules.Dynamicserviceproviders and Nothing in 0 Rules.Unknownserviceresolvers Source=Testedryioc.IU Stacktrace:
At Dryioc.Throw.It(Int32 error, Object arg0, Object arg1, Object arg2, Object Arg3) in C: Work Solutiontest Testedryioc Testedryioc.IU Dryioc Container.Cs:line 11242 at Dryioc.Container.Throwunabletoresolve(Request request) in C: Work Solutiontest Testedryioc Testedryioc.IU Dryioc Container.Cs:line 893 at Dryioc.Container.Dryioc.IContainer.Resolvefactory(Request request) in C: Work Solutiontest Testedryioc Testedryioc.IU Dryioc Container.Cs:line 851 at Dryioc.Container.Resolveandcachedefaultdelegate(Type serviceType, Boolean ifUnresolvedReturnDefault) in C: Work Solutiontest Testedryioc Testedryioc.IU Dryioc Container.Cs:line 557 at Dryioc.Container.Dryioc.IResolver.Resolve(Type serviceType, Boolean ifUnresolvedReturnDefault) in C: Work Solutiontest Testedryioc Testedryioc.IU Dryioc Container.Cs:line 475 at Dryioc.Resolver.Resolve[Tservice](Iresolver resolve, Ifunresolved ifUnresolved) in C: Work Solutiontest Testedryioc Testedryioc.IU Dryioc Container.Cs:line 5665 at Testedryioc.IU.Provadervalidator`1.Getvalidator(Container container) in C: Work Solutiontest Testedryioc Testedryioc.IU Iprovadervalidator.Cs:line 11 at Testedryioc.IU.Program.Main(String[] args) in C: Work Solutiontest Testedryioc Testedryioc.IU Program.Cs:line 31
Vlw, nice that managed to find a solution, if dealing with dryioc is a little unexplored thing yet, I found a way to do this a little bit differently. If something does not appear better I signal your answer at the end of the reward.
– Marco Souza
@Marconciliosouza thank you! I didn’t know it myself, I installed it here to do the tests, but this question of registering several classes of a given interface dynamically is something we always end up using in dependency injection frameworks. I’ll keep thinking here and anything else I edit my answer with a second alternative.
– Alisson
posted the way I did.
– Marco Souza