结构图nancy bootstrapper

Mik*_*ike 2 structuremap nancy

我正在尝试使用structuremap bootstrapper启动带nancyfx https://github.com/NancyFx/Nancy.Bootstrappers.StructureMap

这是我的设置:

        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()
   {

   }
}
Run Code Online (Sandbox Code Playgroud)

当我使用时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 
Run Code Online (Sandbox Code Playgroud)

Byr*_*ahl 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);
        };        
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,模块没有呼叫国际奥委会来获得回购......它已经得到了它.你的引导程序使这成为可能.现在,您可以摆脱ObjectFactory的hacky配置.

作为一些一般性建议,如果您发现自己使用"ObjectFactory"来解析类型,那么您应该自己动手并停止输入.相反,您应该使用构造函数注入注入依赖项,如上所示.