使用Structuremap按类型设置内部依赖关系

使用Structuremap按类型设置内部依赖关系,structuremap,Structuremap,我有一个structuremap配置,让我抓狂。我有一个具体的类,需要一个接口ui元素,它需要一个接口验证类。我希望外部具体类获得默认的ui元素,但获得具体类特定的验证对象。大概是这样的: class MyView { IPrompt prompt } class GenericPrompt : IPrompt { IValidator validator } class MyValidator : IValidator { bool Validate() {} } 如

我有一个structuremap配置,让我抓狂。我有一个具体的类,需要一个接口ui元素,它需要一个接口验证类。我希望外部具体类获得默认的ui元素,但获得具体类特定的验证对象。大概是这样的:

class MyView 
{
   IPrompt prompt
}

class GenericPrompt : IPrompt
{
   IValidator validator
}

class MyValidator : IValidator
{
   bool Validate() {}
}
如何使用注册表DSL将structuremap配置为仅在为MyView创建依赖项时使用MyValidator。(假设在为BobsView创建依赖项时使用BobsValidator)

您是否从容器中获取MyView(和BobsView)?我们能假设他们都会以IPrompt为例吗

一种方法是使用与视图名称匹配的名称注册所有验证器。您可以实现自己的类型扫描程序,只需删除验证程序后缀:

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);
    }
}
现在,如果您假设遵循该命名约定的视图始终会请求IPrompt,那么您的注册表可能如下所示:

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>();
        });
    }
}
公共类验证程序注册表:注册表
{
公共注册处()
{
扫描(扫描=>
{
扫描。卡入总成();
用()扫描;
});
ForRequestedType().TheDefault.Is.ConstructedBy(ctx=>
{
var viewName=ctx.Root.RequestedType.Name.Replace(“视图”,“视图”);
RegisterDefault(typeof(IValidator),ctx.GetInstance(viewName));
返回ctx.GetInstance();
});
}
}
要使用适当的验证器检索视图,您必须请求具体类型:

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

请注意,这仅在通过直接调用容器(服务位置)检索视图时有效,因为它取决于“Root.RequestedType”。根据您计划如何获取视图,您可能能够在构建堆栈中查找视图(而不是假设它始终是根视图)。

BobsView是否也依赖于IPrompt?如果不是,你没有问题。如果是这样的话,你可能想查看个人资料。谢谢。这正是我所需要的。有什么线索可以解释为什么ctx上的intellisense似乎不起作用?