2014-09-30 59 views
0

我正在使用實體框架(EF)的域驅動設計技術,我的一些類沒有公共無參數構造函數。我有一個適用於多個類的服務,其中一些是Entity Framework,另一些是帶有公共參數的DTO。獲取Autofac注入接口的解析類型

因此,我會喜歡Autofac將已解析的接口類型注入到服務ctor中,並且我自己處理創建/處理已解析的TInterface類的問題。

class MyServiceClass<TInterface> : IMyServiceClass<TInterface> 
{ 
    private Type _classType; 

    public MyServiceClass(Type resolvedTypeOfTInterface) 
    { 
     _classType = resolvedTypeOfTInterface; 
    } 
} 

當Autofac解析IMyServiceClass<TInterface>它創建一個類MyServiceClass<TInterface>類型的,這是好的。但是我也想知道接口TInterface解決的類的類型

我可以看到如何通過this stackoverflow answer直接訪問Autofac來獲得課程,但這意味着直接使用Autofac容器,這聽起來不是一個好主意。

任何人都可以建議通過在容器構建時設置一些方法/工廠注入解決類型的TInterface的方式嗎?

+0

您必須在組合根目錄中配置autofac容器。在這種情況下,autofac將處理創建類。你不能讓autofac創建這個類,你自己處理創建這個類。 – Kenneth 2014-10-01 09:01:36

+0

hi @Kenneth。我認爲我的解釋不夠清楚,所以我已經更新了它。基本上我想要的是TInterface類型的類型,而不是實例。我不能讓Autofac創建它,因爲有時它的構造函數是私有的。如果服務代碼有一個公共無參數構造函數或調用額外的代碼來處理給定的DDD類的專用工廠,則可以使用Activator.CreateInstance(type)來創建它。 – 2014-10-01 11:01:53

+0

你可以在構造函數中要求'typeof(TInterface)',不需要注入那個 – Kenneth 2014-10-01 11:32:22

回答

0

在我找到一個可行的答案之前,我嘗試了很多方法。問題在於通用類似乎不允許使用某些方法,例如使用Autofac的ResolvedParameter。我的答案可能不是最簡單的方法來做到這一點,但它的工作原理。我的解決方案如下。

首先我改變MyServiceClass補充一點,可以設置類型的方法:

class MyServiceClass <TInterface> : IMyServiceClass <TInterface>, ISetType 
{ 
    private Type _classType; 

    //normal ctor with any parameters it needs, but NOT including TInterface 
    public MyServiceClass(...) {} 

    public void SetType(Type resolvedType) 
    { 
     _classType = resolvedType; 
    } 
} 

然後添加以下代碼以註冊MyServiceClass<>類型與Autofac:

builder.RegisterGeneric(typeof (MyServiceClass<>)) 
    .As(typeof (IMyServiceClass<>)) 
    .OnActivating(e => 
    { 
     var typeToLookup = e.Instance.GetType().GetGenericArguments()[0]; 
     var foundEntry = 
      e.Context.ComponentRegistry.RegistrationsFor(
       new TypedService(typeToLookup)).SingleOrDefault(); 
     ((ISetType)e.Instance).SetType(foundEntry.Activator.LimitType); 
    }); 

這實現了我需要,也就是說,如果我有一個構造函數,其參數類型爲MyServiceClass<IMyClass>,那麼在由Autofac創建MyServiceClass<IMyClass>之後,私有字段_classType將包含已解決 IMyClass附加到的類,這是我想要的。

任何有關如何以更好的方式做到這一點的意見將受到感謝。