本文整理汇总了C#中ServiceProvider.GetServiceCallSite方法的典型用法代码示例。如果您正苦于以下问题:C# ServiceProvider.GetServiceCallSite方法的具体用法?C# ServiceProvider.GetServiceCallSite怎么用?C# ServiceProvider.GetServiceCallSite使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ServiceProvider
的用法示例。
在下文中一共展示了ServiceProvider.GetServiceCallSite方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: CreateCallSite
public IServiceCallSite CreateCallSite(ServiceProvider provider, ISet<Type> callSiteChain)
{
ConstructorInfo[] constructors = _descriptor.ImplementationType.GetTypeInfo()
.DeclaredConstructors
.Where(IsInjectable)
.ToArray();
// TODO: actual service-fulfillment constructor selection
if (constructors.Length == 1)
{
ParameterInfo[] parameters = constructors[0].GetParameters();
IServiceCallSite[] parameterCallSites = new IServiceCallSite[parameters.Length];
for (var index = 0; index != parameters.Length; ++index)
{
parameterCallSites[index] = provider.GetServiceCallSite(parameters[index].ParameterType, callSiteChain);
if (parameterCallSites[index] == null && parameters[index].HasDefaultValue)
{
parameterCallSites[index] = new ConstantCallSite(parameters[index].DefaultValue);
}
if (parameterCallSites[index] == null)
{
throw new InvalidOperationException(Resources.FormatCannotResolveService(
parameters[index].ParameterType,
_descriptor.ImplementationType));
}
}
return new ConstructorCallSite(constructors[0], parameterCallSites);
}
return new CreateInstanceCallSite(_descriptor);
}
示例2: BuiltExpressionWillReturnResolvedServiceWhenAppropriate
public void BuiltExpressionWillReturnResolvedServiceWhenAppropriate(
ServiceDescriptor[] desciptors, Type serviceType, Func<object, object, bool> compare)
{
var provider = new ServiceProvider(desciptors);
var callSite = provider.GetServiceCallSite(serviceType, new HashSet<Type>());
var collectionCallSite = provider.GetServiceCallSite(typeof(IEnumerable<>).MakeGenericType(serviceType), new HashSet<Type>());
var compiledCallSite = CompileCallSite(callSite);
var compiledCollectionCallSite = CompileCallSite(collectionCallSite);
var service1 = callSite.Invoke(provider);
var service2 = compiledCallSite(provider);
var serviceEnumerator = ((IEnumerable)compiledCollectionCallSite(provider)).GetEnumerator();
Assert.NotNull(service1);
Assert.True(compare(service1, service2));
// Service can be IEnumerable resolved. The IEnumerable should have exactly one element.
Assert.True(serviceEnumerator.MoveNext());
Assert.True(compare(service1, serviceEnumerator.Current));
Assert.False(serviceEnumerator.MoveNext());
}
示例3: PopulateCallSites
private IServiceCallSite[] PopulateCallSites(
ServiceProvider provider,
ISet<Type> callSiteChain,
ParameterInfo[] parameters,
bool throwIfCallSiteNotFound)
{
var parameterCallSites = new IServiceCallSite[parameters.Length];
for (var index = 0; index < parameters.Length; index++)
{
var callSite = provider.GetServiceCallSite(parameters[index].ParameterType, callSiteChain);
if (callSite == null && parameters[index].HasDefaultValue)
{
callSite = new ConstantCallSite(parameters[index].DefaultValue);
}
if (callSite == null)
{
if (throwIfCallSiteNotFound)
{
throw new InvalidOperationException(Resources.FormatCannotResolveService(
parameters[index].ParameterType,
_descriptor.ImplementationType));
}
return null;
}
parameterCallSites[index] = callSite;
}
return parameterCallSites;
}
示例4: BuiltExpressionRethrowsOriginalExceptionFromConstructor
public void BuiltExpressionRethrowsOriginalExceptionFromConstructor()
{
var descriptors = new ServiceCollection();
descriptors.AddTransient<ClassWithThrowingEmptyCtor>();
descriptors.AddTransient<ClassWithThrowingCtor>();
descriptors.AddTransient<IFakeService, FakeService>();
var provider = new ServiceProvider(descriptors);
var callSite1 = provider.GetServiceCallSite(typeof(ClassWithThrowingEmptyCtor), new HashSet<Type>());
var compiledCallSite1 = CompileCallSite(callSite1);
var callSite2 = provider.GetServiceCallSite(typeof(ClassWithThrowingCtor), new HashSet<Type>());
var compiledCallSite2 = CompileCallSite(callSite2);
var ex1 = Assert.Throws<Exception>(() => compiledCallSite1(provider));
Assert.Equal(nameof(ClassWithThrowingEmptyCtor), ex1.Message);
var ex2 = Assert.Throws<Exception>(() => compiledCallSite2(provider));
Assert.Equal(nameof(ClassWithThrowingCtor), ex2.Message);
}
示例5: BuiltExpressionCanResolveNestedScopedService
public void BuiltExpressionCanResolveNestedScopedService()
{
var descriptors = new ServiceCollection();
descriptors.AddScoped<ServiceA>();
descriptors.AddScoped<ServiceB>();
descriptors.AddScoped<ServiceC>();
var provider = new ServiceProvider(descriptors);
var callSite = provider.GetServiceCallSite(typeof(ServiceC), new HashSet<Type>());
var compiledCallSite = CompileCallSite(callSite);
var serviceC = (ServiceC)compiledCallSite(provider);
Assert.NotNull(serviceC.ServiceB.ServiceA);
Assert.Equal(serviceC, callSite.Invoke(provider));
}