1. 程式人生 > >autofac如何註冊靜態方法裡的介面物件

autofac如何註冊靜態方法裡的介面物件

標題可能是不準確的,因為我不知道如何描述。不知道的原因,是對依賴注入一知半解。

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如何註冊靜態方法介面物件

標題可能是不準確的,因為我不知道如何描述。不知道的原因,是對依賴注入一知半解。 Autofac可以自動註冊物件例項到介面,人所盡知。而在asp.net mvc中,這個例項化的工作,通常在每個控制器的建構函式裡完成。 假如,我有些靜態方法裡,非要用到這些介面呢

Java多執行緒-44-靜態和非靜態方法同步鎖物件是什麼

前面一篇,我們知道了synchronized關鍵字擴起來範圍的程式碼塊就可以實現同步,其實,在Java中,只需要在方法上加上synchronized關鍵字即可,就像加上static一樣。本篇來看看加上synchronized關鍵字修飾的非靜態和靜態方法的同步鎖物件是什麼。 1.非靜態同步鎖物

JDK信新特性-----方法引用(引用類的靜態方法、引用物件的普通方法、引用類的普通方法、引用類的構造方法

方法引用的出現: 在JDK1.8以前,引用一般指的是陣列引用、類引用和介面引用,但在JDK1.8後,有了方法引用,引用就是別名,方法引用是一個方法是另一個方法的別名。 方法引用有四種形式: 引用類中靜態方法 使用格式: 類名稱 :: 靜態方法名稱 引用某個物件的方法 使

為什麼靜態方法不能有靜態變數

在方法內部定義的叫“區域性變數”,而不是靜態變數,區域性變數不能加static,包括protected,private,public這些也不能加,而全域性變數是可以的,靜態變數是定義在類中,方法體外面的,區域性變數是儲存在棧中的,而靜態變數儲存在方法區,區域性變量出了方法就會被棧回收了,而靜

"靜態方法只能呼叫靜態變數和靜態方法"詳解

靜態方法裡可以呼叫靜態方法和靜態變數,同時也能呼叫非靜態方法和非靜態變數。 public class Test { public Test() {}; public Test(int i) {this.n = i;} public static int m = 5; p

關於java靜態方法只能呼叫靜態變數的思考

最近一段時間裡面寫了這樣一個類: public class DBManager { private static MySqliteHelper helper; public static MySqliteHelper getHelper(Context c

為什麼從靜態方法不能呼叫非靜態方法和變數

非靜態的方法可以呼叫靜態的方法,但是靜態的方法不可以呼叫非靜態的方法。 類的靜態成員(變數和方法)屬於類本身,在類載入的時候就會分配記憶體,可以通過類名直接去訪問;非靜態成員(變數和方法)屬於類的物件,所以只有在類的物件產生(建立類的例項)時才會分配記憶體,然後通過類的物件(例項)去訪問。 在一個類的靜態成

靜態方法不能使用$this

靜態方法隨著類的載入而載入,靜態方法是優先於物件而存在的。當我們載入一個類的時候,物件還沒有存在,而this代表的是物件的引用,試問當我們載入類的時候物件都沒有,又怎麼可以使用this呢?答案顯而易見 this是指當前物件,靜態方法是通過類呼叫的方法,不需要例

靜態方法不能使用$this標識呼叫靜態方法

# 概述 static關鍵字宣告一個屬性或方法是和類相關的,而不是和類的某個特定的例項相關,因此,這類屬性或方法也稱為"類屬性"

javascript面向物件程式設計--靜態方法

在面向物件程式設計中,類是不能夠直接訪問的,必須例項化後才可以訪問,大多數方法和屬性與類的例項產生聯絡。但是靜態屬性和方法與類本身直接聯絡,可以從類訪問,如javascript的核心物件中的Math和Global都是靜態物件,不需例項化,可以直接訪問 類的靜態成員(屬性和方法)包括私有和共有兩種

深入理解Java中的同步靜態方法和synchronized(class)程式碼塊的類鎖 深入理解Java併發synchronized同步化的程式碼塊不是this物件時的操作

一.回顧學習內容  在前面幾篇部落格中我我們已經理解了synchronized物件鎖、物件鎖的重入、synchronized方法塊、synchronized非本物件的程式碼塊,  連結:https://www.cnblogs.com/SAM-CJM/category/1314992.h

python3__面向物件__靜態方法 / 類方法 / 屬性方法 / 例項動態繫結屬性和方法 / 類動態繫結屬性和方法

0.普通方法 普通方法訪問類屬性:self.__class__.類屬性名稱 class Test(object): n = 123 def __init__(self, n): self.n = n def tell(self):

面向物件-類方法靜態方法

一、類方法和靜態方法 1.類方法 是類本身所擁有的方法,需要用修飾器 @classmethod 來標識其為類方法,對於類方法,一般以cls作為第一個引數,能夠通過例項物件和類本身去訪問   ① 類方法引用 ② 類方法修改類屬性  

java8--介面增強(預設方法靜態方法)

Java8中介面增強:介面靜態方法、介面預設方法。   一、介面靜態方法 在介面方法前新增static 修飾符,表示介面中的靜態方法。介面靜態方法不要求子類實現、重寫,且子類也無法實現和重寫, 因為靜態的東西脫離了物件而存在於類中。 子類繼承和實現的是父類\介

python面向物件學習(六)類屬性、類方法靜態方法

目錄 1. 類的結構 1.1 術語 —— 例項 1.2 類是一個特殊的物件 2. 類屬性和例項屬性 2.1 概念和使用 2.2 屬性的獲取機制 3. 類方法和靜態方法 3.1 類方法 3.2 靜態方法

[PHP]獲取靜態方法呼叫者的類名和運用call_user_func_array代入物件作用域

一、獲取靜態方法呼叫者的類名 方法一: class foo { static public function test() { var_dump(get_called_class()); } } class bar extends foo { } foo::test

Java多執行緒中注入Spring的Bean-使用靜態方法直接取的容器中的spring物件

目前認為比較好的解決方案。 1,工具類 public class SpringApplicationContextHolder implements ApplicationContextAware { private static ApplicationContext context

靜態方法中不可直接new內部類例項物件問題

結論:靜態方法中,是不可以直接new內部類例項物件和引用外部類的成員變數的。 原因:1、外部類中的成員變數、方法以及內部類其實三者都在同一個級別上,三者都必須由外部類的例項物件才能呼叫(舉例:當一個方法被呼叫時,此時肯定已經有了外部類的例項物件。),故而他們三者可以互相引用。 2、而靜

PHP學習——28 PHP面向物件(抽象類與抽象方法介面的實現)

一、抽象類與抽象方法 <?php // 任何一個類,如果它裡面至少有一個方法是被宣告為抽象的,那麼這個類就必須被宣告為抽象的。 abstract class Person // 定義為抽象的類不能被例項化。 { public $name; public function __co

Java8介面預設方法靜態方法

用處:現在要生成文件,有PDF、有doc等格式。他們的路徑、檔名都是一樣的。 程式碼: 介面 生成文件 @FunctionalInterface public interface TService { /** * 生成文件 */