- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用结构图并想将实例(由容器构造)注入(inject)到 Controller 的属性中。实例应命名并存储在 http session 上下文容器中。在我的应用程序的前一个版本中,我使用了自定义 DI 框架,并且很容易制作这样的东西:
public class MyController : Controller
{
[InjectSession("MySessionInstanceKey")]
public MyManager Manager {get; set;}
}
有什么简单的方法可以用 structuremap 来实现吗?
或者也许我可以将我的自定义属性和注入(inject)逻辑引入 SM 框架(以某种方式扩展框架)?
请帮我找到解决这个问题的方法,非常感谢!
附言我找到了临时解决方案,但它增加了 Controller 与 IoC 框架的内聚性,并且包含大量代码:
private const string ordersBulkManagerKey = "_OrdersBulkManager";
public BulkManager OrdersBulkManager
{
get
{
var manager = Session[ordersBulkManagerKey] as BulkManager;
if(manager == null)
Session[ordersBulkManagerKey] = manager
= ObjectFactory.GetInstance<BulkManager>();
return manager;
}
}
所以,我不想在那里使用 ObjectFactory.GetInstance ...
最佳答案
有几篇博文介绍了如何将配置 ASP.NET MVC 和 StructureMap 连接在一起。 (所以下面的大部分代码是各种帖子的摘要。)
实现这一目标的常用方法是声明我们自己的 Controller 工厂类,这将允许我们通过构造函数注入(inject)我们的依赖项。 (ASP.NET MVC 使用的默认 Controller 工厂要求存在默认构造函数)
所以在你的 MyController 类中,你会有一个接受 MyManager 参数的构造函数(它将由我们自己的 Controller 工厂类为你注入(inject))
public class MyController : Controller
{
private readonly ISomeService _someService;
//Constructor Injection.
public MyController(ISomeService someService){
_someService = someService;
}
}
接下来您将配置 ASP.NET MVC 以使用这个新的 Controller 工厂类(我们将其称为 StructureMapControllerFactory)。
protected void Application_Start()
{
//This is where you register your concrete types with StructureMap
Bootstrapper.ConfigureStructureMap();
//Our very own Controller Factory
ControllerBuilder.Current.SetControllerFactory
(new StructureMapControllerFactory());
RegisterRoutes(RouteTable.Routes);
}
在 StructureMapControllerFactory 中,我们调用 ObjectFactory.GetInstance 以将 Controller 返回给我们(前提是我们已连接所有依赖项)
public class StructureMapControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(Type controllerType)
{
if (controllerType == null) return null;
try
{
return ObjectFactory.GetInstance(controllerType) as Controller;
}
catch (StructureMapException)
{
System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave());
throw;
}
}
}
希望我的解释很清楚,但如果不是,请告诉我,我可以对其进行扩展。
顺便说一句,下面的代码片段是您的 Bootstrap 代码的示例。
public static class Bootstrapper
{
public static void ConfigureStructureMap()
{
ObjectFactory.Initialize(
x => x.AddRegistry(new MyApplicationRegistry()));
}
}
public class MyApplicationRegistry : Registry
{
public MyApplicationRegistry()
{
ForRequestedType<ISomeService>()
.CacheBy(InstanceScope.Your_Choice_Here)
.TheDefault.Is.OfConcreteType<SomeService>();
}
}
注意:各种InstanceScope请引用StructureMap文档选项。
关于c# - 使用带结构图的命名 session 实例策略的 Setter 剖分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1130009/
我正在尝试使用 Structure Map 在我的项目中配置 NCommon NHRepository。我如何阻止它选择最贪婪的构造函数? public class NHRepository : R
我的注册表中有以下代码: Scan(x => { x.Assembly(Assembly.GetExecutingAssembly());
我有一个这样的界面 public interface IWriter { ... } 和一个类 public class WriterMerger { public WriterMerger(
是否可以在注册表中注册一个接口(interface),然后“重新注册”它以覆盖第一次注册? 即: For().Use(); For().Use(); 我想要的是在运行时,当我请求 ISomeInter
我正在使用注册表 DSL 示例来配置结构图。但是这样做会使我所有注册的类型在我的应用程序的所有层中都可用,我在其中添加了对结构图的引用。我不希望我的业务层知道我的数据访问层的任何信息,反之亦然。如何让
既然 ObjectFactory 静态函数已被标记为过时,我目前正在尝试了解结构图。 从长远来看,我必须在 MVC 和 WebApi 应用程序中使用它。以前使用时,静态方法的一行被放置在 global
我正在使用 StructureMap存储 session 对象: config.For().LifecycleIs(new HttpSessionLifecycle()); 一切正常,所以我可以使用
我需要在扫描仪的 Ctor 中发送自定义实例。听到是我的代码: public class RunnableScanner : IRegistrationConvention {
我正在为基于 OWIN 的 Web API 做一些集成测试。我正在使用结构图作为 DI 容器。在其中一种情况下,我需要模拟一个 API 调用(不能将其作为测试的一部分)。 我将如何使用 Structu
我想在请求的生命周期内动态地将一个实例注入(inject)到结构图中(即在注册表/配置之外)。 目前我正在 IHttpModule 的 HandleBeginRequest 事件中执行此操作: con
我有包含 IEnumerable 参数的构造函数。当我尝试将具体对象注入(inject) automocker 时,它没有被使用。 当我使用包含 IEnumerable 属性的包装类时,一切都按预期工
我有一个具有以下 ctor 的服务类: public class (IMessageService emailService, IMessageService smsService) { ... }
我正在使用 Ubuntu 10.04,正在研究内核对象的编程。 我遇到过一些相当复杂的结构,我很难阅读,所以我想我会尝试找到一些可以帮助我可视化它们的工具。 目前我唯一能找到的是VCG ,它有一个 C
我知道错误“没有为此对象定义无参数构造函数”已被询问大约一百万次。我的情况不同 我有一个可以运行的应用程序。许多 Controller 和一个区域有许多 Controller 。我刚刚添加了一个新区域
我有一个接口(interface)和一个定义如下的类 public interface IShape { } public class Square : IShape { } 我知道我可以在结构图中为
我在最近的项目中实现事件处理时遇到了困难。 我已验证 structuremap 正在正确扫描、组装和添加 EventHandlers Scan(cfg => {
使用 structuremap 2.6.4.1 我的容器配置如下: existingContainer.Configure(expression => { expression.For()
我在注册一些像这样的依赖项时遇到问题。 No default Instance is registered and cannot be automatically determined for typ
具体来说,使用容器而不是静态 ObjectFactory 是否能让我保持多个并发配置,或者容器是单例? 最佳答案 如果容器是静态的,则它们只是单例。静态类型存在很多问题,尤其是在可测试性方面,所以我绝
给定 public class Blah : IBlah { public Blah(decimal argument) { } } 什么时候 ForRequestedType
我是一名优秀的程序员,十分优秀!