代码之家  ›  专栏  ›  技术社区  ›  Davide Vitali

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

  •  1
  • Davide Vitali  · 技术社区  · 6 年前

    我有一个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
    }
    

    我错过了什么?

    0 回复  |  直到 6 年前