我有一个MyPlugin
,它继承了PluginBase
并启动了各种实例,其中很少是
communicator = new Communicator(bytes, logger, text, configuration);
translator = new Translator(communicator);
host = new NancyHost(new Uri(url));
host.Start();
然后有一个SessionAuthenticationConfiguration
在SessionBootstrapper
中启动:
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
中创建communicator
和ApplicationStartup
实例。
如果无法在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();
}
}
}
}