Interface IDependencyLoopChecker<T>
Runs through a set of objects, checking that no referencial loop exists between them.
Usage: 1. Create new DependencyLoopChecker<T> 2. Provide a mapping function as above 3. Call AddDependency(T) for each item you need to check 4. Call HasLoop() - returns true if you have a loop. 5. Call PrintLooped() to get a message and the list of offending objects. 6. Call Reset() to clear the internal state, to reuse.
Given the following example class:
private class TestLinkedObject
{
public Guid EntityTypeID { get; set; }
public Guid NewEntityTypeID { get; set; }
public override string ToString() => Name;
}
LoopChecker will then generate a wrapper (DependencyLoopItem<T>) for each object that you add via AddDependency(T).
You must provide a lambda for how to map your object to DependencyLoopItem<T>. Given the above code, usage would look like this:
var loopChecker = new DependencyLoopChecker{TestLinkedObject}
(
x => new DependencyItem{TestLinkedObject}
{
From = x.EntityTypeID,
To = x.NewEntityTypeID,
Item = x
}
);
Namespace: LemonEdge.Utils
Assembly: LemonEdge.Utils.dll
Syntax
public interface IDependencyLoopChecker<T>
Type Parameters
| Name | Description |
|---|---|
| T | The type of the Item you would like to check for loops |
Remarks
Note: This checker breaks on the first instance of a loop found. You should identify those, Reset() and repeat the process with the remaining.
Methods
AddDependency(T)
Adds an item to the internal list for checking.
Declaration
void AddDependency(T item)
Parameters
| Type | Name | Description |
|---|---|---|
| T | item | Your item |
HasLoop()
Checks all items added via AddDependency(T), and breaks at the first loop that is found.
Declaration
bool HasLoop()
Returns
| Type | Description |
|---|---|
| bool | Whether a loop was found |
PrintLooped()
Prints out the results found after calling HasLoop().
Declaration
(string Output, T?[] Looped) PrintLooped()
Returns
| Type | Description |
|---|---|
| (string Output, T[] Looped) | A string output of the first loop found, and the list of items. |
RemoveLooped()
Removes the looping items discovered by calling HasLoop(). HasLoop() breaks at the first loop found. Use this to remove that first round of items, then repeat.
Declaration
T?[] RemoveLooped()
Returns
| Type | Description |
|---|---|
| T[] | The removed items |
Reset()
Resets the internal lists for reuse.
Declaration
void Reset()