Как передать параметры в конкретную реализацию IOC Dependency Resolver - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть веб-приложение MVC 5, которое извлекает записи о посещаемости сотрудников, хранящиеся в базе данных SQL Server.Я также внедряю внедрение зависимостей через Ninject, и проблема в том, что я не знаю, как сказать конкретная реализация класса моей посещаемости, как фильтровать данные по дате.Сначала мне сказали, что сайт должен был показывать только записи сегодняшнего дня, затем меня попросили добавить функцию для просеивания через более поздние дни, и теперь у меня проблема, потому что я не знаю, как работать с аргументами вninject.

Во-первых, у меня есть класс посещаемости:

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

и класс, отвечающий за получение посещаемости из базы данных (аргументы конструктора - это год, месяц и день, они необязательны, посколькудолжен показывать текущую запись по умолчанию)

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 в параметр Anno конструктора типа MattinaleRepository 2) Инъекция зависимости 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
}

Чего мне не хватает?

...