我正在尝试使用structuremap引导程序https://github.com/NancyFx/Nancy.Bootstrappers.StructureMap来引导nancyfx。
下面是我的设置:
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 发布于 2012-10-17 02:43:12
我想帮你摆脱黑客攻击...问题的根源在于您使用ObjectFactory的方式。实际上,你不应该在你的NancyModule中使用ObjectFactory来"GetInstance“。相反,您应该在需要存储库的NancyModule的构造函数中包含IRepository。然后,结构映射(已使用引导程序连接到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的繁琐配置了。
作为一些一般的建议,如果你发现自己在使用"ObjectFactory“来解析类型,你应该给自己一巴掌,停止键入。相反,您应该使用构造函数注入来注入依赖,就像我上面展示的那样。
发布于 2012-08-27 11:54:35
不确定提议的答案发生了什么,但这里是我最终解决这个问题的方式。
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);
}这是一个技巧,但这是我设法让它工作的唯一方法。
https://stackoverflow.com/questions/12132975
复制相似问题