2017-03-10 60 views
1

我有一個類如下,其構造函數接受兩個List<T>如何解決具有List <T>參數的構造函數的類?

public class Param<T> 
{ 
    public List<T> Joes { get; } 
    public List<T> Dans { get; } 

    public Param(List<T> joes, List<T> dans) 
    { 
     Joes = joes; 
     Dans = dans; 
    } 
} 

我嘗試註冊和解析這個對象,

static void Main(string[] args) 
{ 
    var builder = new ContainerBuilder(); 
    builder.RegisterType<int>().As<object>(); 
    builder.RegisterGeneric(typeof(Param<>)); 
    var container = builder.Build(); 
    var paramHaha = container.Resolve<Param<object>>(); 
} 

我得到這個例外

錯誤發生在特定註冊的激活期間。 有關詳細信息,請參閱內部例外。註冊:Activator = Param'1 (ReflectionActivator),Services = [ConsoleApplication2.Param'1 [[System.Int32,mscorlib,Version = 4.0.0.0, Culture = neutral,PublicKeyToken = b77a5c561934e089]]],Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime,Sharing = None,所有權 = OwnedByLifetimeScope --->在類型 'ConsoleApplication2.Param'1 [System.Int32'找到'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'時沒有找到構造函數]'可用 可用服務和參數調用:\ r \ n無法解析參數 'System.Collections.Generic.List'1 [System.Int32] joes'of constructor 'Void .ctor(System.Collections.Generic .List'1 [System.Int32], System.Coll ections.Generic.List'1 [System.Int32])」。 (見內 異常的詳細信息。)「}

我怎樣才能解決這個問題呢?我真的不關心什麼是我得到Param對象,我不關心什麼T是該Param只是在其他地方使用的虛擬對象,但我需要得到它正確初始化

+1

應該爲'joes'和'dans'注入什麼?隨機列表? –

+0

@YacoubMassad,是的。 – Graviton

+0

如果你不在意爲這兩個列表注入什麼 - 只需爲該Param創建無參數構造函數。 – Evk

回答

1

爲了指定的報名時間參數值時,您可能需要使用WithParameter方法:。

​​

第二個參數ter ResolveParameter是一個將給出參數值的lambda。由於您使用的是通用版本Param,因此必須使用pi.ParameterType屬性來獲取正確類型的值。

瞭解更多信息

Passing Parameters to Register爲了避免具有joes在你的依賴注入註冊過程中檢索邏輯,可以實現一個JoeProvider

public interface IJoeProvider 
{ 
    List<Object> GetJoes(); 
} 
public interface IJoeProvider<T> : IJoeProvider 
{ 
    List<T> GetJoes(); 
} 


builder.RegisterGeneric(typeof(JoeProvider<>) 
     .As(typeof(IJoeProvider<>)); 
builder.RegisterGeneric(typeof(Param<>)) 
     .As(typeof(Param<>)) 
     .WithParameter(new ResolvedParameter(
      (pi, ctx) => pi.Name == "joes", 
      (pi, ctx) => { 
       Type t = typeof(IJoeProvider<>).MakeGenericType(pi.ParameterType); 
       IJoeProvider p = (IJoeProvider)ctx.Resolve(t); 
       return p.GetJoes(); 
      })); 

當然,爲了避免有JoeProviderDanProvider您只能有一個Provider並使用參數解析它。

public interface IParamProvider 
{ 
    List<Object> GetParams(); 
} 
public interface IParamProvider<T> : IParamProvider 
{ 
    List<T> GetParams(); 
} 
public class ParamProvider<T> : IParamProvider<T> 
{ 
    public ParamProvider(String paramName) 
    { 
     this._paramName = paramName; 
    } 
    private readonly String _paramName; 

    // Do IParamProviderProvider implementation 
} 


builder.RegisterGeneric(typeof(ParamProvider<>) 
     .As(typeof(IParamProvider<>)); 
builder.RegisterGeneric(typeof(Param<>)) 
     .As(typeof(Param<>)) 
     .WithParameter(new ResolvedParameter(
      (pi, ctx) => pi.ParameterType.IsGenericType 
         && pi.ParameterType.GetGenericTypeDefinition() == typeof(List<>), 
      (pi, ctx) => { 
       Type t = typeof(IParamProvider<>).MakeGenericType(pi.ParameterType); 
       IParamProvider p = (IParamProvider)ctx.Resolve(t, new NamedParameter("paramName", pi.Name)); 
       return p.GetParams(); 
      })); 
1

可以用參數一起登記類,像這樣:

builder.RegisterGeneric(typeof(Param<>)).WithParameters(
    new [] {TypedParameter.From<object>(null), TypedParameter.From<object>(null)}); 

這將只是傳遞空值作爲你的情況joesdans

相關問題