Acr*_*gma 9 c# dependency-injection unity-container nancy owin
我有一个Windows服务,我使用OWIN和NancyFX来托管一个网站.在我服务的许多地方,我使用Unity将依赖项注入类,主要是服务.但是,如果我在任何Nancy模块中使用它们,依赖关系会被解析两次,因为Nancy使用自己的IoC容器(TinyIoC).
幸运的是,Nancy允许通过创建nancy bootstrapper来覆盖默认的IoC容器生成和现有容器的使用.但是如何将现有的IUnityContainer传递给引导程序?
基本上,我只需要启动OWIN就是......
WebApp.Start<MyOwinStarter>(url);
Run Code Online (Sandbox Code Playgroud)
如何将Unity容器传递给它以将其进一步传递给nancy bootstrapper?
Acr*_*gma 11
@ ccellar让我走向正确的方向.
我使用以下方法创建了一个静态类UnityHelper:
private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() => {
var section = (UnityConfigurationSection)ConfigurationManager.GetSection("unityConfiguration");
return new UnityContainer().LoadConfiguration(section);
});
public static IUnityContainer GetConfiguredContainer() {
return container.Value;
}
Run Code Online (Sandbox Code Playgroud)
创建了一个自定义的NancyBootstrapper类:
public NancyBootstrapper(IUnityContainer container) {
if(container == null)
throw new ArgumentNullException("container");
this._unityContainer = container;
}
protected override IUnityContainer GetApplicationContainer() {
return _unityContainer;
}
Run Code Online (Sandbox Code Playgroud)
并将容器传递给我的web app启动类中的bootstrapper:
appBuilder.UseNancy(new NancyOptions {
EnableClientCertificates = true,
Bootstrapper
= new NancyBootstrapper(UnityHelper.GetConfiguredContainer())
});
Run Code Online (Sandbox Code Playgroud)
整齐!
免责声明:我真的不知道这是否是这个问题的最佳/最干净/解决方案.但对我来说这很有效.
我把这个容器(Castle Windsor)包裹起来,这基本上是一个单身人士.
public class Container
{
// static holder for instance, need to use lambda to construct since constructor private
private static readonly Lazy<IWindsorContainer> instance = new Lazy<IWindsorContainer>(() =>
{
var container = new WindsorContainer();
container.Install(FromAssembly.This());
return container;
});
// private to prevent direct instantiation.
private Container()
{
}
// accessor for instance
public static IWindsorContainer Instance
{
get
{
return instance.Value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的自定义引导程序中,我像这样访问已配置的容器
protected override Castle.Windsor.IWindsorContainer GetApplicationContainer()
{
return Container.Instance;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3577 次 |
| 最近记录: |