84 lines
2.9 KiB
C#
84 lines
2.9 KiB
C#
// Copyright (c) .NET Foundation. All rights reserved.
|
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
|
|
using System;
|
|
using Microsoft.AspNetCore.Mvc.Internal;
|
|
using Microsoft.AspNetCore.Mvc.ViewFeatures;
|
|
|
|
namespace Microsoft.AspNetCore.Mvc.ViewComponents
|
|
{
|
|
/// <summary>
|
|
/// A default implementation of <see cref="IViewComponentActivator"/>.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// The <see cref="DefaultViewComponentActivator"/> can provide the current instance of
|
|
/// <see cref="ViewComponentContext"/> to a public property of a view component marked
|
|
/// with <see cref="ViewComponentContextAttribute"/>.
|
|
/// </remarks>
|
|
public class DefaultViewComponentActivator : IViewComponentActivator
|
|
{
|
|
private readonly ITypeActivatorCache _typeActivatorCache;
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of <see cref="DefaultViewComponentActivator"/> class.
|
|
/// </summary>
|
|
/// <param name="typeActivatorCache">
|
|
/// The <see cref="ITypeActivatorCache"/> used to create new view component instances.
|
|
/// </param>
|
|
#pragma warning disable PUB0001 // Pubternal type in public API
|
|
public DefaultViewComponentActivator(ITypeActivatorCache typeActivatorCache)
|
|
#pragma warning restore PUB0001
|
|
{
|
|
if (typeActivatorCache == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(typeActivatorCache));
|
|
}
|
|
|
|
_typeActivatorCache = typeActivatorCache;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public virtual object Create(ViewComponentContext context)
|
|
{
|
|
if (context == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(context));
|
|
}
|
|
|
|
var componentType = context.ViewComponentDescriptor.TypeInfo;
|
|
|
|
if (componentType == null)
|
|
{
|
|
throw new ArgumentException(Resources.FormatPropertyOfTypeCannotBeNull(
|
|
nameof(context.ViewComponentDescriptor.TypeInfo),
|
|
nameof(context.ViewComponentDescriptor)));
|
|
}
|
|
|
|
var viewComponent = _typeActivatorCache.CreateInstance<object>(
|
|
context.ViewContext.HttpContext.RequestServices,
|
|
context.ViewComponentDescriptor.TypeInfo.AsType());
|
|
|
|
return viewComponent;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public virtual void Release(ViewComponentContext context, object viewComponent)
|
|
{
|
|
if (context == null)
|
|
{
|
|
throw new InvalidOperationException(nameof(context));
|
|
}
|
|
|
|
if (viewComponent == null)
|
|
{
|
|
throw new InvalidOperationException(nameof(viewComponent));
|
|
}
|
|
|
|
var disposable = viewComponent as IDisposable;
|
|
if (disposable != null)
|
|
{
|
|
disposable.Dispose();
|
|
}
|
|
}
|
|
}
|
|
} |