2012-08-26 87 views
2

我想举nancyfx与structuremap引导程序 https://github.com/NancyFx/Nancy.Bootstrappers.StructureMapstructuremap南希引导程序

这里是我的设置:

 protected override void ConfigureApplicationContainer(IContainer container) 
    { 

     container.Configure(x => 
     { 
      x.ForSingletonOf<IRazorConfiguration>() 
       .Use<DefaultRazorConfiguration>(); 

      x.ForSingletonOf<ISessionContainer>().Use<SessionContainer>(); 

      x.For<IRepository>().LifecycleIs(new HttpContextLifecycle()).Use<Repository>(); 

      x.Scan(scanner=> 
      { 
       scanner.TheCallingAssembly(); 
       scanner.AddAllTypesOf<IRepository>(); 

      }); 
     }); 
     base.ConfigureApplicationContainer(container); 
    } 

public interface IRepository 
{ 
    void Save(); 
} 

    public class Repository:IRepository 
{ 

    ISessionContainer _session; 
    public Repository(ISessionContainer container) 
    { 
     _session = container; 
    } 

    public void Save() 
    { 

    } 
} 

当我使用var repo = ObjectFactory.GetInstance<IRepository>();,我得到这个异常:

StructureMap Exception Code: 202 
No Default Instance defined for PluginFamily Infrastructure.IRepository, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
+0

你在哪里试图获得对'IRepository'的引用? NancyFX很少需要使用ObjectFactory.GetInstance ()。你会使用'IRepository'来更新代码/调用堆栈的样本吗? (如果可以的话,从NancyModule开始) – codeprogression

回答

1

不知道提出的答案发生了什么,但这里是我最终解决这个问题的方法。

protected override void ConfigureApplicationContainer(IContainer container) 
{ 
    container.Configure(x => 
    { 
     x.ForSingletonOf<IRazorConfiguration>() 
      .Use<DefaultRazorConfiguration>(); 
     x.ForSingletonOf<ISessionContainer>().Use<SessionContainer>();//Duplicate 
     x.Scan(scanner=> 
     { 
      scanner.TheCallingAssembly(); 
      scanner.AddAllTypesOf<IRepository>(); 
     }); 
    }); 
    ObjectFactory.Configure(x => 
    { 
     x.ForSingletonOf<ISessionContainer>().Use<SessionContainer>();//Duplicate 
     x.For<IRepository>().Use<Repository>(); 
    }); 
    base.ConfigureApplicationContainer(container); 
} 

这是一个黑客,但这是我设法让这个工作的唯一途径。

6

我想帮助你摆脱黑客攻击......问题的根源在于你使用ObjectFactory的方式。真的,你不应该在你的NancyModule中使用ObjectFactory来“GetInstance”。相反,您应该在需要存储库的NancyModule的构造函数中包含IRepository。然后,Structuremap(已经使用引导程序连接到Nancy框架中)将在实例化时简单地将具体存储库注入到模块中。这里有一个NancyModule的例子:

public class ProductModule : NancyModule { 

    private IRepository _repository; 

    public ProductModule(IRepository repository) { 

     _repository = repository; 

     SetupRoutes(); 
    } 

    private void SetupRoutes() { 
     Get["/product/{id}"] = p => { 
      return _repository.Get<Product>((int)p.id); 
     };   
    } 
} 

这里,模块没有呼唤国际奥委会获得回购......它已经得到了它。你的引导程序使这成为可能。现在,您可以摆脱ObjectFactory的hacky配置。作为一些常规建议,如果您发现自己使用“ObjectFactory”来解析类型,则应该打耳光并停止输入。相反,你应该像上面展示的那样使用构造器注入来注入依赖项。