将类的实例添加到已经运行的Nancy应用程序中

问题描述 投票:0回答:1

我有一个MyPlugin,它继承了PluginBase并启动了各种实例,其中很少是

communicator = new Communicator(bytes, logger, text, configuration);
translator = new Translator(communicator);

host = new NancyHost(new Uri(url));
host.Start();

然后有一个SessionAuthenticationConfigurationSessionBootstrapper中启动:

public class SessionBootstrapper : DefaultNancyBootstrapper
{
   protected override void ConfigureApplicationContainer(TinyIoCContainer container)
   {
      base.ConfigureApplicationContainer(container);
      container.Register<ISessionMapper, SessionDatabase>();
   }

   protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
   {
      base.ApplicationStartup(container, pipelines);

      var tokenValidationParameters = new TokenValidationParameters
      {
           //setting parameters
      };

      var sessionAuthConfiguration = new SessionAuthenticationConfiguration()
      {
         SessionMapper = container.Resolve<ISessionMapper>(),
         TokenValidationParameters = tokenValidationParameters
      }; 

      SessionAuthentication.Enable(pipelines, sessionAuthConfiguration);
   }
}

我如何注册translator实例,以便可以在OpenModule中使用它,如下所示:

public class OpenModule : NancyModule
{
   public OpenModule(ITranslator translator)
   {
      Get("/ping", args =>
      {
         {
            return translator.DoSomething();
         }
      }
   }
}

由于其他原因,我无法在translator中创建communicatorApplicationStartup实例。

c# dependency-injection nancy tinyioc
1个回答
0
投票

如果无法在ApplicationStartup中创建实例,则可以注册工厂实例,而可以在需要它们时用于创建类的实例,例如:

public interface ITranslatorFactory
{
    ITranslator CreateTranslator(byte[] bytes, ILogger logger, string text, Config configuration));
}

然后您实施工厂:

public class TranslatorFactory : ITranslatorFactory
{
    public ITranslator CreateTranslator(byte[] bytes, ILogger logger, string text, Config configuration))
    {
         var communicator = new Communicator(bytes, logger, text, configuration);
         return new Translator(communicator);
    }
}

然后您在容器中注册此实现,并在您的类中使用它:

protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
    base.ConfigureApplicationContainer(container);
    container.Register<ISessionMapper, SessionDatabase>();
    container.Register<ITranslatorFactory, TranslatorFactory>().AsSingleton();
}

public class OpenModule : NancyModule
{
   public OpenModule(ITranslatorFactory translatorFactory)
   {
      // Get bytes, logger, text and configuration here...
      [...]
      var translator = translatorFactory.CreateTranslator(bytes, logger, text, configuration);

      Get("/ping", args =>
      {
         {
            return translator.DoSomething();
         }
      }
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.