Pergunta

Eu tenho uma configuração StructureMap que tem me coçar a cabeça. Eu tenho uma classe concreta que requer um elemento ui com interface que requer uma classe de validação com interface. Eu quero a classe concreta exterior para obter o elemento ui padrão, mas obter um objeto de validação específico concreto-class-. Algo parecido com isto:

class MyView 
{
   IPrompt prompt
}

class GenericPrompt : IPrompt
{
   IValidator validator
}

class MyValidator : IValidator
{
   bool Validate() {}
}

Como posso configurar StructureMap com o DSL Registry apenas MyValidator uso ao criar dependências para MyView. (E assumedly usando BobsValidator ao criar dependências para BobsView)

Foi útil?

Solução

Você está recebendo MyView (e BobsView) do recipiente? podemos assumir que todos eles vão tomar uma instância de IPrompt?

Uma abordagem seria a de registrar todos os seus validadores com um nome que coincide com os nomes de sua vista. Você poderia implementar seu próprio scanner tipo que apenas remove o sufixo Validador:

public class ValidatorScanner : ITypeScanner
{
    public void Process(Type type, PluginGraph graph)
    {
        if (!typeof (IValidator).IsAssignableFrom(type)) return;
        var validatorName = type.Name.Replace("Validator", "");
        graph.AddType(typeof(IValidator), type, validatorName);
    }
}

Agora, se você assumir uma IPrompt sempre será solicitado por uma visão que segue essa convenção de nomenclatura, o registro poderia ser semelhante a:

public class ValidatorRegistry : Registry
{
    public ValidatorRegistry()
    {
        Scan(scan =>
        {
            scan.TheCallingAssembly();
            scan.With<ValidatorScanner>();
        });

        ForRequestedType<IPrompt>().TheDefault.Is.ConstructedBy(ctx =>
        {
            var viewName = ctx.Root.RequestedType.Name.Replace("View", "");
            ctx.RegisterDefault(typeof(IValidator), ctx.GetInstance<IValidator>(viewName));
            return ctx.GetInstance<GenericPrompt>();
        });
    }
}

Para recuperar sua opinião com o validador apropriado, você teria que solicitar o tipo concreto:

var view = container.GetInstance<MyView>();

Note que isso só funcionará se você está recuperando sua opinião com uma chamada direta para o recipiente (local de serviço), uma vez que depende da "Root.RequestedType". Dependendo de como você pretende obter os seus pontos de vista, você pode ser capaz de caminhar até o BuildStack procurando uma View (em vez de assumir que é sempre Root).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top