aspnetcore/src/Microsoft.AspNetCore.Mvc.Core/Internal/CompositeChangeToken.cs

86 lines
2.3 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 System.Collections.Generic;
using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Mvc.Internal
{
internal class CompositeChangeToken : IChangeToken
{
public CompositeChangeToken(IList<IChangeToken> changeTokens)
{
if (changeTokens == null)
{
throw new ArgumentNullException(nameof(changeTokens));
}
ChangeTokens = changeTokens;
}
public IList<IChangeToken> ChangeTokens { get; }
public IDisposable RegisterChangeCallback(Action<object> callback, object state)
{
var disposables = new IDisposable[ChangeTokens.Count];
for (var i = 0; i < ChangeTokens.Count; i++)
{
var disposable = ChangeTokens[i].RegisterChangeCallback(callback, state);
disposables[i] = disposable;
}
return new CompositeDisposable(disposables);
}
public bool HasChanged
{
get
{
for (var i = 0; i < ChangeTokens.Count; i++)
{
if (ChangeTokens[i].HasChanged)
{
return true;
}
}
return false;
}
}
public bool ActiveChangeCallbacks
{
get
{
for (var i = 0; i < ChangeTokens.Count; i++)
{
if (ChangeTokens[i].ActiveChangeCallbacks)
{
return true;
}
}
return false;
}
}
private class CompositeDisposable : IDisposable
{
private readonly IDisposable[] _disposables;
public CompositeDisposable(IDisposable[] disposables)
{
_disposables = disposables;
}
public void Dispose()
{
for (var i = 0; i < _disposables.Length; i++)
{
_disposables[i].Dispose();
}
}
}
}
}