如何将参数传递给IOC依赖关系解析器的具体实现

时间:2018-12-14 12:03:19

标签: c# asp.net-mvc interface ninject

我有一个MVC 5 Web应用程序,它检索存储在SQL Server数据库中的员工出勤记录。我还通过Ninject实现依赖注入,问题是我不知道如何告诉考勤班的具体实现如何按日期过滤数据。最初,我被告知该站点应该只显示当前的记录,然后要求我添加一个功能以筛选以后的日子,现在我遇到了一个问题,因为我不知道如何处理其中的参数ninject。

首先,我参加了上课:

public class Comunicazione
{
    public DateTime Data { get; set; }
    // other properties
}

和负责从数据库中检索出勤的类(构造函数的参数是Year,Month和Day,它们是可选的,因为默认情况下应显示当前的记录)

public class SqlServerDbMattinale
{
    private SqlConnection _connection;
    public IList<Comunicazione> Mattinale { get; set; }

    // optional arguments added later on
    public SqlServerDbMattinale(int Anno = 0, int Mese = 0, int Giorno = 0)
    {
        _connection = new SqlConnection(myConnectionString);
        _connection.Open();

        Mattinale = new List<Comunicazione>();

        // feed with data from db and close the connection
    }
}

然后是存储库界面:

public interface IMattinaleRepository
{
    IList<Comunicazione> Comunicazioni { get; }
}

及其具体实现:

public class MattinaleRepository : IMattinaleRepository
{
    private SqlServerDbMattinale context = new SqlServerDbMattinale();

    public IList<Comunicazione> Comunicazioni
    {
        get { return context.Mattinale; }
    }
}

这是我的第一个问题:如何将参数传递给此类?如何让Ninject告诉框架“嘿,我需要带有这些参数的IMattinale类的具体实现”?

我第一次构建站点时,Ninject正确解决了依赖性:

private void AddBindings()
{
    kernel.Bind<IMattinaleRepository>().To<MattinaleRepository>();
}

我已经开始尝试修改具体的存储库

public class MattinaleRepository : IMattinaleRepository
{
    private static int anno;
    private static int mese;
    private static int giorno;

    public MattinaleRepository(int Anno, int Mese, int Giorno)
    {
        anno = Anno;
        mese = Mese;
        giorno = Giorno;
    }

    private SqlServerDbMattinale context = new SqlServerDbMattinale(anno, mese, giorno);

    public IList<Comunicazione> Comunicazioni
    {
        get { return context.Mattinale; }
    }
}

但是我得到了这个错误,这很有意义

  

激活int时出错没有匹配的绑定可用,并且类型   不是自绑定的。激活路径:3)注入依赖项int   到类型MattinaleRepository 2的构造函数的参数Anno中)   将依赖项IMattinaleRepository注入参数   mattinaleRepository类型为MattinaleController的构造函数1)   要求MattinaleController

但是如何注入这些参数?

谢谢。

编辑:

我已经编写了一个工厂界面,

public interface IMattinaleFactory
{
    MattinaleRepository Create(int Anno, int Mese, int Giorno);
}

其具体对应物

public class MattinaleFactory : IMattinaleFactory
{
    private IResolutionRoot ResolutionRoot;

    public MattinaleFactory(IResolutionRoot resolutionRoot)
    {
        ResolutionRoot = resolutionRoot;
    }

    public MattinaleRepository Create(int Anno, int Mese, int Giorno)
    {
        return ResolutionRoot.Get<MattinaleRepository>(
            new ConstructorArgument("Anno", Anno),
            new ConstructorArgument("Mese", Mese),
            new ConstructorArgument("Giorno", Giorno));
    }
}

注册绑定,

kernel.Bind<IMattinaleFactory>().To<MattinaleFactory>();

并修改了存储库类,但是当我到达这里时,所有参数都设置为0。即使工厂正确地传递了参数,也是如此。

public class MattinaleRepository : IMattinaleRepository
{
    private static int anno;
    private static int mese;
    private static int giorno;

    public static int Anno { get => anno; set => anno = value; }
    public static int Mese { get => mese; set => mese = value; }
    public static int Giorno { get => giorno; set => giorno = value; }

    private SqlServerDbMattinale context = new SqlServerDbMattinale(Anno, Mese, Giorno);

    public IList<Comunicazione> Comunicazioni
    {
        get { return context.Mattinale; }
    }
}

这是我在控制器中致电工厂的方式:

public ActionResult Index(int anno = 0, int mese = 0, int giorno = 0)
{
    // this is always empty
    this.MattinaleRepository = MattinaleFactory.Create(anno, mese, giorno);

    // populate the view
}

我想念什么?

0 个答案:

没有答案