Постинициализация создания объекта с помощью ninject - PullRequest
5 голосов
/ 22 ноября 2011

Я новичок в Ninject (и DI в целом).

Я понимаю, как ядро ​​загружает модули, и код, который я написал до сих пор, имеет одну строку:

myKernel.Get<MyApp>()

, которая создает все, что мне нужно, из привязок в моем модуле.,Если есть необходимость в новых экземплярах после инициализации, об этом заботятся фабрики, которые я связываю для инициализации.До сих пор фабрики были свободны от любых незначительных зависимостей, просто обновляя объекты по требованию.

Теперь я достиг точки, когда мне нужно подумать о создании объектов после инициализации, а мой собственный шаблон фабрики нерезать это больше.Это будет поддерживать интерфейс pub / sub для (удаленных) клиентов.При каждом новом подключении к моему серверу я хотел бы создавать новые IClient экземпляры в соответствии с набором привязок, определенных в модуле ninject.Означает ли это, что фабрика, которую я передаю при инициализации, должна иметь собственное ядро ​​(или ссылку на основное ядро)?Где в этом будет функция CommonServiceLocator.Нужна ли CSL?

Прежде чем я зашел слишком далеко в тупики, я подумал, что лучше спросить здесь о том, как другие могут подойти к этой проблеме.

Ответы [ 2 ]

5 голосов
/ 22 ноября 2011

Создать заводской интерфейс

public interface IClientFactory
{
    IClient CreateClient();
}

Для Ninject 2.3 см. https://github.com/ninject/ninject.extensions.factory, и пусть Ninject реализует его, добавив следующую конфигурацию.

Bind<IClientFactory>().ToFactory();

Для 2.2 сделать реализацию самостоятельно. Эта реализация является частью конфигурации контейнера, а не частью ваших реализаций.

public class ClientFactory: IClientFactory
{
    private IKernel kernel;
    public ClientFactory(IKernel kernel)
    {
        this.kernel = kernel;
    }

    public IClient CreateClient()
    {
        return this.kernel.Get<IClient>();
    }
}
1 голос
/ 22 ноября 2011

Похоже, что следующий шаблон для фабрики может удовлетворить мои требования:

Bind<Func<IClient>>().ToMethod(ctx => () => ctx.Kernel.Get<ClientImpl>());

где у меня есть конструктор вида:

SomeCtor(Func<IClient> clientFactory, blah...)
...