4
A
回答
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.");
}
相關問題
- 1. Autofac服務未註冊(Microsoft Bot框架)
- 2. 請求的服務尚未註冊! AutoFac依賴注入
- 3. 服務未啓動註冊
- 4. IllegalArgumentException:服務未註冊:
- 5. Android服務未註冊
- 6. 如何獲得所有已註冊的服務類型Autofac
- 7. Eureka服務器 - 列出所有已註冊的實例
- 8. Autofac - 請求的服務(lSomeDbContext)尚未註冊
- 9. 注入服務爲使用Autofac
- 10. 注射服務爲使用Autofac
- 11. 註冊Windows服務
- 12. 自己的服務 - 類型沒有服務已註冊
- 13. 停止監控SMSS中已註冊服務器的SQL服務
- 14. angular2實例化服務
- 15. 在不註冊服務類型的情況下解析autofac中的服務
- 16. C# - Windows服務安裝程序未註冊服務
- 17. 班級未註冊vfp網絡服務
- 18. 微服務未註冊尤里卡
- 19. 服務人員離線時未註冊
- 20. Laravel:爲什麼在實例化其提供的類時未註冊註冊的服務提供者?
- 21. 調用WCF服務 - 服務實例
- 22. 使用Silverlight的wcf服務註冊表/服務定位器
- 23. 如何創建多個註冊到尤里卡服務註冊中心的尤里卡服務實例?
- 24. 微服務:服務發現和服務註冊與阿卡
- 25. 使用ES6語法註冊AngularJS服務
- 26. 使用WiX註冊ActiveX exe服務器
- 27. 如何使用Mono.ZeroConf註冊服務?
- 28. Castle windsor:如何使用一個實施實例註冊兩個服務?
- 29. WCF寧靜服務注入WebOperationContext與Autofac
- 30. 如何使用wix刪除已註冊的卸載服務?
嗨保羅 - 更多的一些細節將有助於澄清你這個是什麼意思。乾杯! – 2011-02-19 02:06:08