Ninject - как и когда ввести

Вот одна книга, которую можно найти полезным: Программирование Пролога для Искусственного интеллекта Ivan Bratko.

первая часть о Прологе, втором об алгоритмах AI и как реализовать их в Прологе.

18
задан Peter Majeed 23 May 2013 в 20:53
поделиться

2 ответа

Вы непосредственно обновляете TestClass , который Ninject не имеет возможности перехватить - помните, что нет такой магии, как преобразование кода, перехватывающей ваши новые и т. Д.

Вы должны использовать kernel.Get .

В противном случае вы можете внедрить его после , нового ядра . Inject (test);

Я думаю, что в вики есть статья, в которой говорится о Inject vs Get и т. Д.

Обратите внимание, что в общем случае direct Get [ Вызовы 1115940] или Inject - это неправильный запах местоположения службы, который является антипаттерном. В случае вашего веб-приложения NinjectHttpModule и PageBase - это ловушка, которая перехватывает создание объекта - аналогичные перехватчики / логические места для перехвата и в других стилях приложений.

Re your Bind (). ToSelf () , как правило, StandardKernel имеет ImplicitSelfBinding = true , что сделает это ненужным (если вы не хотите, чтобы его Область действия была чем-то другим, кроме ] .InTransientScope () ).

Последний пункт стиля: - вы используете внедрение свойств. Для этого редко есть веские причины, поэтому вместо этого вам следует использовать внедрение конструктора.

И покупайте Внедрение зависимостей в .NET от @Mark Seemann ,

18
ответ дан 30 November 2019 в 08:33
поделиться

Хорошо,

Я узнал, как делать то, что мне нужно, отчасти благодаря твоим комментариям, Рубен. Я создал новый модуль, который в основном содержит конфигурацию, которую я использую в библиотеке классов. В этом модуле я могу либо выполнить привязку с помощью интерфейса-заполнителя, либо добавить параметр конструктора в CustomerLoader. Ниже приведен код фиктивного консольного приложения для демонстрации обоих способов.

Это может помочь кому-то другому начать работу с Ninject!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Ninject.Core;
using Ninject.Core.Behavior;

namespace NinjectTest
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var kernel = new StandardKernel(new RepositoryModule(), new  ProgramModule());            
            var loader = kernel.Get<CustomerLoader>();
            loader.LoadCustomer();
            Console.ReadKey();
        }
    }

    public class ProgramModule : StandardModule
    {
        public override void Load()
        {
            // To get ninject to add the constructor parameter uncomment the line below
            //Bind<CustomerLoader>().ToSelf().WithArgument("fileName", "string argument file name");
            Bind<LiveFileName>().To<LiveFileName>();
        }
    }

    public class RepositoryModule : StandardModule
    {
        public override void Load()
        {
            Bind<ICustomerRepository>().To<CustomerRepository>().Using<SingletonBehavior>();
        }
    }

    public interface IFileNameContainer
    {
        string FileName { get; }
    }
    public class LiveFileName : IFileNameContainer
    {
        public string FileName
        {
            get { return "live file name"; }
        }
    }


    public class CustomerLoader
    {
        [Inject]
        public ICustomerRepository CustomerRepository { get; set; }
        private string _fileName;

        // To get ninject to add the constructor parameter uncomment the line below
        //public CustomerLoader(string fileName)
        //{
        //    _fileName = fileName;
        //}
        public CustomerLoader(IFileNameContainer fileNameContainer)
        {
            _fileName = fileNameContainer.FileName;
        }

        public void LoadCustomer()
        {
            Customer c = CustomerRepository.GetCustomer();
            Console.WriteLine(string.Format("Name:{0}\nAge:{1}\nFile name is:{2}", c.Name, c.Age, _fileName));
        }
    }

    public interface ICustomerRepository
    {
        Customer GetCustomer();
    }
    public class CustomerRepository : ICustomerRepository
    {
        public Customer GetCustomer()
        {
            return new Customer() { Name = "Ciaran", Age = 29 };
        }
    }
    public class Customer
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
}
7
ответ дан 30 November 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: