【问题标题】:structuremap nancy bootstrapper结构图南希引导程序
【发布时间】:2012-10-17 02:43:11
【问题描述】:

我正在尝试使用结构映射引导程序引导 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()
   {

   }
}

当我使用var repo = ObjectFactory.GetInstance&lt;IRepository&gt;(); 时,我得到了这个异常:

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

【问题讨论】:

  • 您想从哪里获得对IRepository 的引用? NancyFX 很少需要使用 ObjectFactory.GetInstance()。你会更新你使用IRepository的代码/调用堆栈示例吗? (如果可以的话,从 NancyModule 开始)

标签: structuremap nancy


【解决方案1】:

我想帮助您摆脱黑客攻击...问题的根源在于您使用 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);
        };        
    }
}

在这里,模块并没有向 IOC 发出请求来获得回购……它已经获得了它。您的引导程序使这成为可能。现在,您可以摆脱 ObjectFactory 的 hacky 配置了。

作为一般建议,如果您发现自己使用“ObjectFactory”来解析类型,您应该打自己一巴掌并停止输入。相反,您应该像上面显示的那样使用构造函数注入来注入依赖项。

【讨论】:

    【解决方案2】:

    不确定建议的答案发生了什么,但这是我最终解决此问题的方法。

    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);
    }
    

    这是一个 hack,但这是我设法让它工作的唯一方法。

    【讨论】:

      猜你喜欢
      • 2015-05-25
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多