我有一个mvc5web应用程序,它检索存储在sqlserver数据库中的员工出勤记录。我还通过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类型构造函数的参数Anno(2)
将依赖项IMattinaleRepository注入参数
MattinaleController 1)类型构造函数的MattinalEspository
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>();
修改了repository类,但是当我到达这里时,参数都设置为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
}
我错过了什么?