2011-02-18 102 views

回答

6

這是從容器中解析未註冊混凝土類型的另一種方法。請注意,所有autofac構造函數查找和選擇邏輯,所有註冊事件處理程序仍然有效。

首先,你定義了這個方法:

public static object ResolveUnregistered(this IComponentContext context, Type serviceType, IEnumerable<Parameter> parameters) 
    { 
     var scope = context.Resolve<ILifetimeScope>(); 
     using (var innerScope = scope.BeginLifetimeScope(b => b.RegisterType(serviceType))) 
     { 
      IComponentRegistration reg; 
      innerScope.ComponentRegistry.TryGetRegistration(new TypedService(serviceType), out reg); 

      return context.ResolveComponent(reg, parameters); 
     } 
    } 

的想法是,你從推導的情境組件註冊,並在目前的情況下解決這個問題。 然後你就可以創建一些方便的重載:

public static object ResolveUnregistered(this IComponentContext context, Type serviceType) 
    { 
     return ResolveUnregistered(context, serviceType, Enumerable.Empty<Parameter>()); 
    } 

    public static object ResolveUnregistered(this IComponentContext context, Type serviceType, params Parameter[] parameters) 
    { 
     return ResolveUnregistered(context, serviceType, (IEnumerable<Parameter>)parameters); 
    } 

    public static TService ResolveUnregistered<TService>(this IComponentContext context) 
    { 
     return (TService)ResolveUnregistered(context, typeof(TService), Enumerable.Empty<Parameter>()); 
    } 

    public static TService ResolveUnregistered<TService>(this IComponentContext context, params Parameter[] parameters) 
    { 
     return (TService)ResolveUnregistered(context, typeof(TService), (IEnumerable<Parameter>)parameters); 
    } 
+0

我想知道如果'serviceType`實現`IDisposable`和`innerScope`得到處理會發生什麼...... – 2015-12-09 13:15:38

3

我發現需要一些自定義代碼的解決方案。 Somethings是特定於我的應用程序,但我認爲你可以得到的圖片。

Resolve(parameter.ParameterType)將是對您的容器的調用。

public object ResolveUnregistered(Type type) 
{ 
    var constructors = type.GetConstructors(); 
    foreach (var constructor in constructors) 
    { 
     try 
     { 
      var parameters = constructor.GetParameters(); 
      var parameterInstances = new List<object>(); 
      foreach (var parameter in parameters) 
      { 
       var service = Resolve(parameter.ParameterType); 
       if (service == null) throw new NopException("Unkown dependency"); 
       parameterInstances.Add(service); 
      } 
      return Activator.CreateInstance(type, parameterInstances.ToArray()); 
     } 
     catch (NopException) 
     { 

     } 
    } 
    throw new NopException("No contructor was found that had all the dependencies satisfied."); 
}