簡體   English   中英

Ninject靜態屬性可以綁定嗎?

[英]Is possible Ninject static property binding?

ninject是否適用於靜態屬性綁定?

我用Ninject設置了IEventHandlerFactory

public class ServiceModule: NinjectModule
{
    public override void Load()
    {
      Kernel.Bind<IEventHandlerFactory>().To<EventHandlerFactoryService>();
    }
}

還有我的靜態課

public static class DomainEvents
{
    public static IEventHandlerFactory EventHandlerFactory { get; set; }

    public static void Raise<T>(T domainEvent) 
    {
        EventHandlerFactory
            .GetDomainEventHandlersFor(event)
            .ForEach(h => h.Handle(event));
    }
}

但這並不綁定到靜態屬性。

DomainEvents.EventHandlerFactory為Null

有什么方法可以綁定財產嗎?

由於ninject沒有將“創建所有綁定”和“使用內核”分開的概念,因此“在內核完成所有綁定后告訴我,以便我可以做某事”當然沒有擴展點。 對於靜態類,從內核請求它也是沒有意義的。

因此,顯而易見的答案是:不。

當然,顯而易見的解決方案是使用如下調用將代碼擴展到完成內核構建的位置(可能接近您執行var kernel = new StandardKernel()

DomainEvents.EventHandlerFactory = kernel.Get<IEventHandlerFactory>();

備選方案1-將初始化綁定到另一種類型的激活

如果該初始化應該與另一種類型的激活聯系在一起,那么假設IFoo ,您還可以執行以下操作:

kernel.Bind<IFoo>()
      .To<Foo>()
      .InSingletonScope()
      .OnActivation(x => 
          DomainEvents.EventHandlerFactory = kernel.Get<IEventHandlerFactory>());

備選方案2-將初始化綁定到NinjectModule加載

您可以訂閱NinjectModule並在其Load中初始化static屬性。 如果您可以確保僅在內核充分初始化以創建IEventHandlerFactory之后才加載模塊,則此方法IEventHandlerFactory

放棄

兩種選擇都可能很爛,因為它們不清楚和不直接。 他們在某個地方深藏了依賴性。 如果第一種方法不可行,我只會使用其中的一種,例如,因為您編寫了插件並且沒有擴展點內核后的初始化。

您真的需要DomainEvents類是靜態的嗎?

也許您可以執行以下操作。 提升仍然是靜態的。

您將必須調用kernel.Get。

public class DomainEvents
{
    public static IEventHandlerFactory EventHandlerFactory { get; set; }

    public DomainEvents(IEventHandlerFactory factory)
    {
         EventHandlerFactory = factory;
    }

    public static void Raise<T>(T domainEvent) 
    {
        EventHandlerFactory
            .GetDomainEventHandlersFor(event)
            .ForEach(h => h.Handle(event));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM