我有一个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
}
我想念什么?