5

我无法使用 ninject 定义绑定。

我在一个标准的 ASP.NET WebForms 应用程序中。我已经定义了一个 http 处理程序来在页面和控件中注入依赖项(属性注入)。

这是我正在尝试做的事情:

我正在创建一个自定义组合框用户控件。基于该组合框上的枚举值,我希望能够在属性中注入不同的对象(我想做的比这更复杂,但对此的回答应该足以让我继续)。

4

2 回答 2

10

基于属性值的条件绑定不是一个好的设计,甚至是不可能的(至少对于构造函数注入而言),因为依赖项通常是在对象接收它们之前创建的。以后物业改了怎么办?更可取的方法是注入一个工厂或工厂方法,从 Ninject 请求实例,并在内部交换初始化和属性值更改的策略。

public enum EntityType { A,B } 
public class MyControl : UserControl
{
    [Inject]
    public Func<EntityType, IMyEntityDisplayStrategy> DisplayStrategyFactory 
    { 
        get { return this.factory; }
        set { this.factory = value; this.UpdateEntityDisplayStrategy(); }
    }

    public EntityType Type 
    { 
        get { return this.type; } 
        set { this.type = value; this.UpdateEntityDisplayStrategy(); };
    }

    private UpdateEntityDisplayStrategy()
    {
        if (this.DisplayStrategyFactory != null)
            this.entityDisplayStrategy = this.DisplayStrategyFactory(this.type);
    }
}

Bind<Func<EntityType, IMyEntityDisplayStrategy>>
    .ToMethod(ctx => type => 
         type == ctx.kernel.Get<IMyEntityDisplayStrategy>( m => 
             m.Get("EntityType", EntityType.A));
Bind<IMyEntityDisplayStrategy>.To<AEntityDisplayStrategy>()
    .WithMetadata("EntityType", EntityType.A)
Bind<IMyEntityDisplayStrategy>.To<BEntityDisplayStrategy>()
    .WithMetadata("EntityType", EntityType.B)

或者,添加激活操作并手动注入依赖项。但请注意,更改约束属性会导致状态不一致。

OnActivation((ctx, instance) => 
    instance.MyStrategy = ctx.Kernel.Get<MyDependency>(m => 
        m.Get("MyConstraint", null) == instance.MyConstraint);
于 2011-03-29T09:17:37.930 回答
0

我正在使用的(现在使用 Ninject 3)有点不同,但它对我有用。我创建了一组依赖项,让他们决定是否接受处理请求。例如,如果我有这种情况

public enum FileFormat
{
    Pdf,
    Word,
    Excel,
    Text,
    Tex,
    Html
}

public interface IFileWriter
{
    bool Supports(FileFormat format)

    ...
}

public class FileProcessor
{
    FileProcessor(IFileWriter[] writers)
    {
        // build a dictionary with writers accepting different formats 
        // and choose them when needed
    }
}

public class MyModule : NinjectModule
{
     public override void Load()
     {
         ...

         Bind<IFileWriter>().To<PdfFileWriter>();
         Bind<IFileWriter>().To<WordFileWriter>();
         Bind<IFileWriter>().To<TexFileWriter>();
         Bind<IFileWriter>().To<TextFileWriter>();
         Bind<IFileWriter>().To<HtmlFileWriter>();
     }
}

我希望这会有所帮助!

于 2014-05-02T15:24:54.337 回答