Property Injection с помощью Ninject

117
11 августа 2021, 19:00

Использую библиотеку Ninject. Помогите разобраться почему не работает Property Injection. В проекте создаю библиотеку классов и консольное приложение для ее отладки. Добавляю UnitOfWork

internal interface IUnitOfWork : IDisposable
{
    void SaveChanges();
    IRepository<T> Repository<T>() where T : class;
}
internal class UnitOfWork : IUnitOfWork, IDisposable
{
    [Inject]
    public IDBContext context { get; set; }
    public void Dispose()
    {
        if (context != null)
        {
            context.Dispose();
            context = null;
        }
    }
    public IRepository<T> Repository<T>() where T : class
    {
        return new Repository<T>();
    }
    public void SaveChanges()
    {
        context.SaveChanges();
    }
}

Также в библиотеке классов создаю модельный объект на основе данных из БД

internal class ObjCtlg
{
    public IEnumerable<IComposite> Items { get; set; }
    [Inject]
    internal IUnitOfWork uow { get; set; }
    public ObjCtlg()
    {
        using (uow)
        {
            Items = uow.Objects().Find(d => d.Id != 0).Select(c =>
            new Document
            {
                Id = c.Id,
                Name = c.Name,
            });
        }
    }
}

Добавляю модуль Ninject в библиотеку классов

public class NinjectBindingModule : NinjectModule
{
    public override void Load()
    {
        Bind<IUnitOfWork>().To<UnitOfWork>();
    }
}

В консольном приложении добавляю ядро Ninject

public static class IoCKernel
{
    private static IKernel kernel;
    public static void CreateKernel()
    {
        kernel = new StandardKernel(new NinjectSettings
        {
            InjectNonPublic = true,
            InjectParentPrivateProperties = true,
            LoadExtensions = true,
        });
        kernel.Load(AppDomain.CurrentDomain.GetAssemblies());
    }
    public static T Get<T>()
    {
        return kernel.Get<T>();
    }
    public static void Inject<T>(T item)
    {
        kernel.Inject(item);
    }
}

Создаю ядро при старте приложения

    static void Main(string[] args)
    {
        IoCKernel.CreateKernel();
        var test = new Test();
    }

При создании ядра я прохожу по модулю "NinjectBindingModule : NinjectModule" из библиотеки классов. Т.е как я ожидаю Binding выполнился. После этого я создаю тестовый объект чтобы посмотреть как прошел биндинг UnitOfWork

internal class Test
{
    public ProgramFirst()
    {
        var t = new ObjCtlg();
    }
}

В итоге свойтсво имеет значение null

    [Inject]
    internal IUnitOfWork uow { get; set; }

Я ожидал что при создании тестового объекта произойдет Injection, но этого не происходит. Новичек в Ninject подскажите что делаю не так?

READ ALSO
Entity Framework фильтр данных

Entity Framework фильтр данных

Всем привет, недавно начал осваиватьnet mvc - возник вопрос выборки данных из БД

264
Проблемы с BackgroundWorker!

Проблемы с BackgroundWorker!

Я новичок в C#При работе с BackgroundWorker возник казус

232