在域模型中动态分配域模型

时间:2012-06-21 21:43:29

标签: asp.net-mvc dependency-injection ninject abstract-factory

这是我的第一个问题,在我试图解决这个问题的过程中,我已经为这几天的写作感到痛苦。

我在Mark Seeman的书中购买了.NET中的Dependency Injection,并且一直试图在Ninject网站上使用它和创建抽象工厂类的例子。一般的想法是,我有一个表格包含问题的答案列表。答案可以是各种类型,所以我使用工厂来创建相关的答案类型。

我收到错误:

Error activating IAnswerValue
No matching bindings are available, and the type is not self-bindable.
Activation path:
 1) Request for IAnswerValue

Suggestions:
 1) Ensure that you have defined a binding for IAnswerValue.
 2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
 3) Ensure you have not accidentally created more than one kernel.
 4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.
 5) If you are using automatic module loading, ensure the search path and filters are correct.

我最初尝试使用参数,但为了简化此示例的操作,我已将其全部删除。错误消息中给出的建议似乎都不适用,工厂类型是绑定,表单服务也是如此,但answervalue显然不是。

这是我的NinjectWebCommon.cs

中的代码
kernel.Bind<DomainModel.IAnswerValue>().To<DomainModel.AnswerValue>();
kernel.Bind<DomainModel.IAnswerValue>().To<DomainModel.StringAnswerValue>(); 
kernel.Bind<DomainModel.IAnswerValue>().To<DomainModel.DateTimeAnswerValue>();     

kernel.Bind<IAnswerValueFactory>().ToFactory();

这是答案类定义:

public class Answer
{
    readonly IAnswerValueFactory answerValueFactory;

    public int Id { get; set; }
    public Question Question { get; set; }
    public string Type { get; set; }

    public Answer(IAnswerValueFactory answerValueFactory)
    {
        this.answerValueFactory = answerValueFactory;
    }

     public void GetAnswerValue()
    {
        var answer = this.answerValueFactory.GetAnswerValue();     
    }

    public List<AnswerItem> PotentialAnswers { get; set; }

}    

和答案值:

public interface IAnswerValue 
{

    AnswerValue GetAnswerValue();
}

public class AnswerValue : IAnswerValue
{
    readonly IAnswerValue answerValue;

    public AnswerValue() { }
    public AnswerValue(IAnswerValue answerValue)
    {
        this.answerValue = answerValue;
    }

    public AnswerValue GetAnswerValue()
    {
        // this will contain a switch statement to 
        // determine the type returned but I have
        // omitted for this example

        return new StringAnswerValue();
    }
}

public class StringAnswerValue : AnswerValue
{
    public string StringAnswer { get; set; }
}

和工厂:

public class AnswerValueFactory : IAnswerValueFactory
{      
    readonly IAnswerValue answerValue;

    public AnswerValueFactory(IAnswerValue answerValue)
    {
        this.answerValue = answerValue;
    }


    public IAnswerValue GetAnswerValue()    
    {
        return (IAnswerValue)this.answerValue.GetAnswerValue();
    }

}

我觉得我已经筋疲力尽了,而且我只是一遍又一遍地尝试同样的事情。必须有一些非常简单的东西,但是我不知道它是什么。

0 个答案:

没有答案