博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVC TIP8:为控制器增加有参构造函数(为了注入等其它用途)
阅读量:6508 次
发布时间:2019-06-24

本文共 2197 字,大约阅读时间需要 7 分钟。

控制器本身是不带有参的构造函数的,如果我们为控制器仅仅提供有参的构造函数,就会报错。不过,可以利用DependencyResolver的SetResolver方法,让ASP.NET MVC支持有参的构造函数。

1:为系统准备两个类型,如下:

注意,这里要实现的是让控制器支持Unity注入。

UnityControllerFactory代码如下:

public 
class 
UnityControllerFactory : DefaultControllerFactory
{
    
IUnityContainer container;
    
public 
UnityControllerFactory(IUnityContainer container)
    
{
        
this
.container = container;
    
}
 
    
protected 
override 
IController GetControllerInstance(RequestContext reqContext,
        
Type controllerType)
    
{
        
if 
(controllerType ==
null
)
        
{
            
return 
null
;
        
}
        
return 
container.Resolve(controllerType)
as 
IController;
    
}
}

UnityDependencyResolver代码如下:

public 
class 
UnityDependencyResolver : IDependencyResolver
{
    
IUnityContainer container;
 
    
public 
UnityDependencyResolver(IUnityContainer container)
    
{
        
this
.container = container;
    
}
 
    
public 
object 
GetService(Type serviceType)
    
{
        
if 
(!
this
.container.IsRegistered(serviceType))
        
{
            
return 
null
;
        
}
        
return 
container.Resolve(serviceType);
    
}
 
    
public 
IEnumerable<
object
> GetServices(Type serviceType)
    
{
        
return 
container.ResolveAll(serviceType);
    
}
}

2:在Application_Start中注册

代码如下:

using 
(IUnityContainer container =
new 
UnityContainer())
{
    
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection(
"unity"
);
    
section.Configure(container,
"containerOne"
);
    
//tell mvc use UnityDependencyResolver to create controll instances;
    
container.RegisterType<IControllerFactory, UnityControllerFactory>();
    
//_container.RegisterType<ISubjectRepository, SubjectRepository>(new TransientLifetimeManager());
    
DependencyResolver.SetResolver(
new 
UnityDependencyResolver(container));
}

3:Web.config配置如下

<configSections>
  
<section name=
"unity" 
type=
"Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"
/>
</configSections>
 
<unity xmlns=
""
>
  
<assembly name=
"SampleProject"
/>
  
<
namespace 
name=
"SampleProject"
/>
 
  
<alias alias=
"ISampleClass" 
type=
"ISampleClass" 
/>
  
<alias alias=
"SampleClass" 
type=
"SampleClass" 
/>
 
  
<container name=
"containerOne"
>
    
<register type=
"ISampleClass" 
mapTo=
"SampleClass" 
/>
  
</container>
 
</unity>

至此,完成本文所述功能。

本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/archive/2011/12/22/2298262.html,如需转载请自行联系原作者

你可能感兴趣的文章
深入理解java异常处理机制
查看>>
Redis客户端redisson实战
查看>>
连接到 JasperReports Server
查看>>
java处理高并发高负载类网站问题
查看>>
使用C#生成随机密码(纯数字或字母)和随机卡号(数字与字母组合)
查看>>
CAS服务器端集群
查看>>
Android内存泄漏的常见场景及解决方案
查看>>
设计模式 之 访问者模式
查看>>
用JS获取地址栏参数的方法
查看>>
JAVA Collections框架
查看>>
更改Windwos server 2003 域用户密码策略默认配置
查看>>
网站白名单可行性分析
查看>>
进制转换
查看>>
反转字符串中的单词
查看>>
html与html5的一些区别
查看>>
ASCII码
查看>>
java常用四种排序源代码
查看>>
win7 下硬盘安装Redhat7
查看>>
Configuring Zookeeper Cluster
查看>>
js图表控件:highcharts的应用
查看>>