标题可能是不准确的,因为我不知道如何描述。不知道的原因,是对依赖注入一知半解。

Autofac可以自动注册对象实例到接口,人所尽知。而在asp.net mvc中,这个实例化的工作,通常在每个控制器的构造函数里完成。

假如,我有些静态方法里,非要用到这些接口呢?怎么实例化它们?例如:

public static bool SetData()
{
//这里需要用到实例化的某个对象,例如ILog
}

你当然可以将这个对象作为参数传递进来,如

public static bool SetData(Ilog log)

问题是,有时候并不方便将这个实例化对象传进来,原因可能是这个静态方法很多地方都在使用,要传这个实例对象,需要改好多地方;并且每个调用方,都要在自己的构造函数里加入这个接口作为参数(不然咋注册?)

最好的办法就是在这个静态方法里注册或获得实例对象

public static bool SetData()
{
//在这里获得实例化对象,如
ILog log = ....
}

但如何获取这个实例对象呢?new一个的话,autofac的优势就荡然无存了。之所以使用autofac,使用IOC容器,就是为了面向接口编程。如果从设计阶段就写死对象的实例化类型,就不叫面向接口编程了。

那么,如何实例化?

可以酱紫:

public static bool SetData()
{
//DependencyResolver是System.MVC里的对象
//下面这个表达式大意是,获得现行注册的对象类型,来实例化接口对象
//换言之,这是autofac的手动实例化方式
ILog log = DependencyResolver.Current.GetService<ILog>();
}

前提条件,是该实例化对象类型要在项目的初始化阶段注册,比如在ASP.NET MVC项目里的app_start事件里注册:

builder.RegisterType<MyLog>().As<ILog>().InstancePerLifetimeScope();

参考文章:

[Autofac怎么依赖注入ASP.NET MVC5类的静态方法]

(http://www.lanhusoft.com/Article/366.html)

autofac如何注册静态方法里的接口对象的更多相关文章

  1. 向虚拟机注册钩子,实现Bean对象的初始化和销毁方法

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 有什么方式,能给代码留条活路? 有人说:人人都是产品经理,那你知道吗,人人也都可以是 ...

  2. EF6CodeFirst+MVC5+Autofac泛型注册 入门实例

    贴一个EF6 CodeFirst模式结合MVC5和Autofac(泛型注册)的一个入门实例 网上类似的例子实在太少,最近自己也有用到这一块的知识,总结了一下,不要让后人踩了自己踩过的坑. 1:新建三个 ...

  3. "静态方法里仅仅能调用静态变量和静态方法"具体解释

    静态方法里能够调用静态方法和静态变量,同一时候也能调用非静态方法和非静态变量. public class Test { public Test() {}; public Test(int i) {th ...

  4. 创建DirectInput接口对象说明---(void **)&m_pDI

    读别人代码时遇到的,起初没明白过来这是怎么回事,后来忽然想明白了. if (FAILED(DirectInput8Create(appInstance, DIRECTINPUT_VERSION, II ...

  5. C# 实例化接口对象

    在head first 设计模式中 用到了很多很多接口对象 首先澄清一个问题,就是接口不仅可以声明对象,而且可以把对象实例化,还可以当做参数被传入. 一.接口回调 这就是继承中的向上转型.父类 FL= ...

  6. Tcp 数据对象传输接口对象设计

    输入是一个对象inputObj,接口对象.Send(inputObj),对端接收之后解包成outputObj(与inputObj应相同),触发onPackageReceive事件 事件 public ...

  7. 在静态方法里调用spring注入的方法

    在静态方法里直接调用非静态方法是不行的. 那如何调用spring注入的方法呢? @Component public class AutoLoginUtil {     @Autowired     p ...

  8. Statemen接口对象

    利用Statement接口实现数据表的更新和查询操作 -取得Statement接口对象:Statement createStatement(int resultSetType, int resultS ...

  9. 服务端怎样暴露IBinder接口对象

    服务端怎样暴露IBinder接口对象: package com.example.mydownload; import android.app.Service; import android.conte ...

随机推荐

  1. vue 运行时 + 编译器 vs. 只包含运行时

    https://cn.vuejs.org/v2/guide/installation.html#运行时-编译器-vs-只包含运行时 文档中的这个地方,说的不清楚 If you need to comp ...

  2. Django 1.8.11 REST风格路由

    # -*- coding: utf-8 -*- """ Tencent is pleased to support the open source community b ...

  3. Android布局之线性布局——LinearLayout

    本文将详细介绍线性布局的各种xml属性. xml属性 <?xml version="1.0" encoding="utf-8"?> <Line ...

  4. 【MySQL】性能优化之 Index Condition Pushdown

    一 概念介绍    Index Condition Pushdown (ICP)是MySQL 5.6 版本中的新特性,是一种在存储引擎层使用索引过滤数据的一种优化方式.a 当关闭ICP时,index ...

  5. ssm依赖

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  6. bzoj 1702 贪心,前缀和

    [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 807  Solved: ...

  7. captcha库报错"OSError: cannot open resource"

    问题描述 在win平台上python虚拟环境下使用captcha库生成验证码报错OSError: cannot open resource 代码 from captcha.image import I ...

  8. hdu5608:function

    $n^2-3n+2=\sum_{d|i}f(i)$,问$f(i)$前$n$项和. 方法一:直接切入! $S(n)=\sum_{i=1}^{n}f(i)=\sum_{i=1}^{n}(i^2-3i+2- ...

  9. 一致性哈希算法-----> 解决memecache 服务器扩容后的数据丢失。

    1 基本场景 比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 ...

  10. 洛谷—— P1785 漂亮的绝杀

    https://www.luogu.org/problem/show?pid=1785 题目背景 话说absi2011的企鹅在和斗神塔第60层的Boss战斗 不好,这局要输了,企鹅还剩4血了Boss还 ...