Вот одна книга, которую можно найти полезным: Программирование Пролога для Искусственного интеллекта Ivan Bratko.
первая часть о Прологе, втором об алгоритмах AI и как реализовать их в Прологе.
Вы непосредственно обновляете TestClass
, который Ninject не имеет возможности перехватить - помните, что нет такой магии, как преобразование кода, перехватывающей ваши новые
и т. Д.
Вы должны использовать kernel.Get
.
В противном случае вы можете внедрить его после , нового
ядра . Inject (test);
Я думаю, что в вики есть статья, в которой говорится о Inject
vs Get
и т. Д.
Обратите внимание, что в общем случае direct Get [ Вызовы 1115940] или
Inject
- это неправильный запах местоположения службы, который является антипаттерном. В случае вашего веб-приложения NinjectHttpModule
и PageBase
- это ловушка, которая перехватывает создание объекта - аналогичные перехватчики / логические места для перехвата и в других стилях приложений.
Re your Bind
, как правило, StandardKernel
имеет ImplicitSelfBinding = true
, что сделает это ненужным (если вы не хотите, чтобы его Область действия была чем-то другим, кроме ] .InTransientScope ()
).
Последний пункт стиля: - вы используете внедрение свойств. Для этого редко есть веские причины, поэтому вместо этого вам следует использовать внедрение конструктора.
И покупайте Внедрение зависимостей в .NET от @Mark Seemann ,
Хорошо,
Я узнал, как делать то, что мне нужно, отчасти благодаря твоим комментариям, Рубен. Я создал новый модуль, который в основном содержит конфигурацию, которую я использую в библиотеке классов. В этом модуле я могу либо выполнить привязку с помощью интерфейса-заполнителя, либо добавить параметр конструктора в 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; }
}
}