c#-使用结构化映射的命名会话实例策略进行Setter insection
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-使用结构化映射的命名会话实例策略进行Setter insection,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2796字,纯文字阅读大概需要4分钟。
内容图文
![c#-使用结构化映射的命名会话实例策略进行Setter insection](/upload/InfoBanner/zyjiaocheng/670/2a5d8c13947941a4aa4aa48097785165.jpg)
我正在使用结构图,并想将实例(由容器构造)注入控制器的属性中.实例应命名并存储在http会话上下文容器中.
在我的应用程序的先前版本中,我使用了自定义DI框架,并且可以很容易地进行如下操作:
public class MyController : Controller
{
[InjectSession("MySessionInstanceKey")]
public MyManager Manager {get; set;}
}
有没有简单的方法可以做到这一点?或者,也许我可以将自定义属性和注入逻辑引入SM框架(以某种方式扩展框架)?
请帮助我找到解决此问题的方法,非常感谢!
附言我已经找到了临时解决方案,但是它增加了控制器与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连接在一起. (因此,下面的大多数代码是那里各种文章的摘要.)
实现此目的的常见方法是声明我们自己的控制器工厂类,这将允许我们通过构造函数注入依赖项. (ASP.NET MVC使用的默认控制器工厂要求存在默认构造函数)
因此,在您的MyController类中,您将拥有一个接受MyManager参数的构造函数(该参数将由我们自己的控制器工厂类注入)
public class MyController : Controller
{
private readonly ISomeService _someService;
//Constructor Injection.
public MyController(ISomeService someService){
_someService = someService;
}
}
接下来,您将配置ASP.NET MVC,以使用此新的控制器工厂类(我们将其称为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,您将向我们返回控制器(前提是我们已连接所有依赖项)
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;
}
}
}
希望我的解释很清楚,但如果不是,请告诉我,我可以继续进行扩展.
顺便说一句,下面的代码片段是一个有关您的引导代码外观的示例.
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#-使用结构化映射的命名会话实例策略进行Setter insection全部内容,希望文章能够帮你解决c#-使用结构化映射的命名会话实例策略进行Setter insection所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。