From 0ed81d68c8181fcea07afb54585b55fd0351ad07 Mon Sep 17 00:00:00 2001 From: Holger Boerchers Date: Sat, 28 Jul 2018 23:57:14 +0200 Subject: [PATCH] Added Prism to example, Added ability to filter files and minor bugfixes --- Creator/ApplicationArguments.cs | 12 + Creator/Helper/Minimatcher.cs | 1042 +++ Creator/Helper/Utils.cs | 37 +- Creator/KattekerCreator.csproj | 1 + Creator/Program.cs | 2 +- Example/App.xaml | 3 +- Example/App.xaml.cs | 9 +- Example/Bootstrapper.cs | 16 + Example/Example.csproj | 20 + Example/Properties/AssemblyInfo.cs | 4 +- Example/packages.config | 8 + Katteker.Gui/UpdateWindow.cs | 8 +- Katteker.Gui/UserInterface.cs | 9 +- Katteker.Test/Katteker.Test.csproj | 79 +- Katteker.Test/KattekerLibTest.cs | 12 +- Katteker.Test/testdata/Autofac.dll | Bin 0 -> 203264 bytes Katteker.Test/testdata/Autofac.xml | 6923 +++++++++++++++++ Katteker.Test/testdata/Example.exe.config | 6 + Katteker.Test/testdata/Example.vshost.exe | Bin 0 -> 35840 bytes .../testdata/Katteker.UserInterface.dll | Bin 0 -> 23040 bytes .../Katteker.UserInterface.dll.config | 23 + .../testdata/Katteker.UserInterface.xml | 155 + Katteker.Test/testdata/Katteker.dll | Bin 0 -> 67072 bytes .../Microsoft.Practices.ServiceLocation.dll | Bin 0 -> 18112 bytes .../Microsoft.Practices.ServiceLocation.xml | 268 + Katteker.Test/testdata/Prism.Autofac.Wpf.dll | Bin 0 -> 18432 bytes .../testdata/Prism.Autofac.Wpf.dll.config | 11 + Katteker.Test/testdata/Prism.Autofac.Wpf.xml | 266 + Katteker.Test/testdata/Prism.Wpf.dll | Bin 0 -> 140288 bytes Katteker.Test/testdata/Prism.Wpf.xml | 5527 +++++++++++++ Katteker.Test/testdata/Prism.dll | Bin 0 -> 31744 bytes Katteker.Test/testdata/Prism.xml | 1275 +++ .../testdata/System.Windows.Interactivity.dll | Bin 0 -> 55904 bytes Katteker.Test/testdata/changelog.md | 5 + .../testdata/squirrelHelperInfo.json | 6 + Katteker/KattekerConfig.cs | 18 +- Katteker/UpdateManager.cs | 10 +- Katteker/Utility.cs | 2 +- 38 files changed, 15713 insertions(+), 44 deletions(-) create mode 100644 Creator/Helper/Minimatcher.cs create mode 100644 Example/Bootstrapper.cs create mode 100644 Example/packages.config create mode 100644 Katteker.Test/testdata/Autofac.dll create mode 100644 Katteker.Test/testdata/Autofac.xml create mode 100644 Katteker.Test/testdata/Example.exe.config create mode 100644 Katteker.Test/testdata/Example.vshost.exe create mode 100644 Katteker.Test/testdata/Katteker.UserInterface.dll create mode 100644 Katteker.Test/testdata/Katteker.UserInterface.dll.config create mode 100644 Katteker.Test/testdata/Katteker.UserInterface.xml create mode 100644 Katteker.Test/testdata/Katteker.dll create mode 100644 Katteker.Test/testdata/Microsoft.Practices.ServiceLocation.dll create mode 100644 Katteker.Test/testdata/Microsoft.Practices.ServiceLocation.xml create mode 100644 Katteker.Test/testdata/Prism.Autofac.Wpf.dll create mode 100644 Katteker.Test/testdata/Prism.Autofac.Wpf.dll.config create mode 100644 Katteker.Test/testdata/Prism.Autofac.Wpf.xml create mode 100644 Katteker.Test/testdata/Prism.Wpf.dll create mode 100644 Katteker.Test/testdata/Prism.Wpf.xml create mode 100644 Katteker.Test/testdata/Prism.dll create mode 100644 Katteker.Test/testdata/Prism.xml create mode 100644 Katteker.Test/testdata/System.Windows.Interactivity.dll create mode 100644 Katteker.Test/testdata/changelog.md create mode 100644 Katteker.Test/testdata/squirrelHelperInfo.json diff --git a/Creator/ApplicationArguments.cs b/Creator/ApplicationArguments.cs index eec0663..9887437 100644 --- a/Creator/ApplicationArguments.cs +++ b/Creator/ApplicationArguments.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.ComponentModel; using System.IO; @@ -11,6 +12,7 @@ namespace KattekerCreator private string _programFile; private string _publishDir; private string _version; + private string _filterAsString; [DisplayName("Program")] [Description("Path to the program file")] @@ -60,6 +62,14 @@ namespace KattekerCreator set => SetPropertyIfNotDefault(ref _version, value); } + [DisplayName("Filter")] + [Description("Filter parameter. Use minimatch pattern.")] + public string FilterAsString + { + get => _filterAsString; + set => SetPropertyIfNotDefault(ref _filterAsString, value); + } + private static bool SetPropertyIfNotDefault(ref T field, T value) { if (Equals(value, field)) return false; @@ -67,5 +77,7 @@ namespace KattekerCreator field = value; return true; } + + public string[] Filter => string.IsNullOrWhiteSpace(FilterAsString) ? new string[0] : FilterAsString.Split(';'); } } \ No newline at end of file diff --git a/Creator/Helper/Minimatcher.cs b/Creator/Helper/Minimatcher.cs new file mode 100644 index 0000000..450a0e9 --- /dev/null +++ b/Creator/Helper/Minimatcher.cs @@ -0,0 +1,1042 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace Minimatch +{ + ///Contains options that control how Minimatch matches strings. + public class Options + { + ///Suppresses the behavior of treating # at the start of a pattern as a comment. + public bool NoComment { get; set; } + ///Suppresses the behavior of treating a leading ! character as negation. + public bool NoNegate { get; set; } + ///Do not expand {a,b} and {1.3} brace sets. + public bool NoBrace { get; set; } + ///Disable ** matching against multiple folder names. + public bool NoGlobStar { get; set; } + ///Ignores case differences when matching. + public bool NoCase { get; set; } + ///Disable "extglob" style patterns like +(a|b). + public bool NoExt { get; set; } + ///Allow patterns to match filenames starting with a period, even if the pattern does not explicitly have a period in that spot. + ///Note that by default, a/**/b will not match a/.d/b, unless dot is set. + public bool Dot { get; set; } + ///When a match is not found by Match(), return a list containing the pattern itself. If not set, an empty list is returned if there are no matches. + public bool NoNull { get; set; } + ///Returns from negate expressions the same as if they were not negated. (ie, true on a hit, false on a miss). + public bool FlipNegate { get; set; } + + ///If set, then patterns without slashes will be matched against the basename of the path if it contains slashes. For example, a?b would match the path /xyz/123/acb, but not /xyz/acb/123. + public bool MatchBase { get; set; } + + internal RegexOptions RegexOptions { get { return NoCase ? RegexOptions.IgnoreCase : RegexOptions.None; } } + + ///If true, backslahes in patterns and paths will be treated as forward slashes. This disables escape characters. + public bool AllowWindowsPaths { get; set; } + + // Aliases: + ///Ignores case differences when matching. This is the same as NoCase. + public bool IgnoreCase + { + get { return NoCase; } + set { NoCase = value; } + } + } + + + ///Parses a single glob pattern and tests strings against it. + public class Minimatcher + { + ///Creates a filter function that tests input against a pattern. + public static Func CreateFilter(string pattern, Options options = null) + { + if (pattern == null) throw new ArgumentNullException("pattern"); + // "" only matches "" + if (String.IsNullOrWhiteSpace(pattern)) return String.IsNullOrEmpty; + + var m = new Minimatcher(pattern, options); + return m.IsMatch; + } + ///Tests a single input against a pattern. + ///This function reparses this input on each invocation. For performance, avoid this function and reuse a Minimatcher instance instead. + public static bool Check(string input, string pattern, Options options = null) + { + if (input == null) throw new ArgumentNullException("input"); + if (pattern == null) throw new ArgumentNullException("pattern"); + + // shortcut: comments match nothing. + if (options != null && !options.NoComment && pattern[0] == '#') + { + return false; + } + + // "" only matches "" + if (String.IsNullOrWhiteSpace(pattern)) return input == ""; + + return new Minimatcher(pattern, options).IsMatch(input); + } + + ///Filters a list of inputs against a single pattern. + ///This function reparses this input on each invocation. For performance, avoid this function and reuse a Minimatcher instance instead. + public static IEnumerable Filter(IEnumerable list, string pattern, Options options = null) + { + var mm = new Minimatcher(pattern, options); + list = list.Where(mm.IsMatch); + if (options != null && options.NoNull) + list = list.DefaultIfEmpty(pattern); + return list; + } + + ///Compiles a pattern into a single regular expression. + public static Regex CreateRegex(string pattern, Options options = null) + { + return new Minimatcher(pattern, options).MakeRegex(); + } + + + readonly Options options; + + string pattern; + bool negate = false; + bool comment = false; + bool empty = false; + + ///Creates a new Minimatcher instance, parsing the pattern into a regex. + public Minimatcher(string pattern, Options options = null) + { + if (pattern == null) throw new ArgumentNullException("pattern"); + this.options = options ?? new Options(); + this.pattern = pattern.Trim(); + if (this.options.AllowWindowsPaths) + this.pattern = this.pattern.Replace('\\', '/'); + + this.Make(); + } + + ///Checks whether a given string matches this pattern. + public bool IsMatch(string input) { return Match(input, false); } + + ///Filters a list of inputs against this pattern. + public IEnumerable Filter(IEnumerable list) + { + list = list.Where(IsMatch); + if (options.NoNull) + list = list.DefaultIfEmpty(pattern); + return list; + } + + + Regex regexp; + bool isError; + + IEnumerable globSet; + IEnumerable> set; + IEnumerable> globParts; + + + // any single thing other than / + // don't need to escape / when using new RegExp() + const string qmark = "[^/]" + + // * => any number of characters + , star = qmark + "*?" + + // ** when dots are allowed. Anything goes, except .. and . + // not (^ or / followed by one or two dots followed by $ or /), + // followed by anything, any number of times. + , twoStarDot = "(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?" + + // not a ^ or / followed by a dot, + // followed by anything, any number of times. + , twoStarNoDot = "(?:(?!(?:\\/|^)\\.).)*?"; + + // characters that need to be escaped in RegExp. + static readonly HashSet reSpecials = new HashSet("().*{}+?[]^$\\!".ToCharArray()); + static readonly Regex slashSplit = new Regex("/+"); + + void Make() + { + // empty patterns and comments match nothing. + if (!options.NoComment && !string.IsNullOrEmpty(pattern) && pattern[0] == '#') + { + this.comment = true; + return; + } + if (String.IsNullOrEmpty(pattern)) + { + this.empty = true; + return; + } + + // step 1: figure out negation, etc. + this.ParseNegate(); + + // step 2: expand braces + this.globSet = BraceExpand(pattern, options); + + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + this.globParts = globSet.Select(s => slashSplit.Split(s)).ToList(); + + // glob --> regexps + this.set = globParts.Select(g => g.Select(t => this.Parse(t, false))) + .Where(g => !g.Contains(null)) + .Select(g => g.Select(t => t.Item1)) + .ToList(); + } + + void ParseNegate() + { + var negateOffset = 0; + + if (options.NoNegate) return; + + for (var i = 0; i < pattern.Length && pattern[i] == '!'; i++) + { + negate = !negate; + negateOffset++; + } + + if (negateOffset > 0) this.pattern = pattern.Substring(negateOffset); + } + + static readonly Regex hasBraces = new Regex(@"\{.*\}"); + static readonly Regex numericSet = new Regex(@"^\{(-?[0-9]+)\.\.(-?[0-9]+)\}"); + // Brace expansion: + // a{b,c}d -> abd acd + // a{b,}c -> abc ac + // a{0..3}d -> a0d a1d a2d a3d + // a{b,c{d,e}f}g -> abg acdfg acefg + // a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg + // + // Invalid sets are not expanded. + // a{2..}b -> a{2..}b + // a{b}c -> a{b}c + ///Expands all brace ranges in a pattern, returning a sequence containing every possible combination. + public static IEnumerable BraceExpand(string pattern, Options options) + { + if (options.NoBrace || !hasBraces.IsMatch(pattern)) + { + // shortcut. no need to expand. + return new[] { pattern }; + } + bool escaping = false; + int i; + // examples and comments refer to this crazy pattern: + // a{b,c{d,e},{f,g}h}x{y,z} + // expected: + // abxy + // abxz + // acdxy + // acdxz + // acexy + // acexz + // afhxy + // afhxz + // aghxy + // aghxz + + // everything before the first \{ is just a prefix. + // So, we pluck that off, and work with the rest, + // and then prepend it to everything we find. + if (pattern[0] != '{') + { + // console.error(pattern) + string prefix = null; + for (i = 0; i < pattern.Length; i++) + { + var c = pattern[i]; + // console.error(i, c) + if (c == '\\') + { + escaping = !escaping; + } + else if (c == '{' && !escaping) + { + prefix = pattern.Substring(0, i); + break; + } + } + + // actually no sets, all { were escaped. + if (prefix == null) + { + // console.error("no sets") + return new[] { pattern }; + } + + return BraceExpand(pattern.Substring(i), options).Select(t => prefix + t); + } + + // now we have something like: + // {b,c{d,e},{f,g}h}x{y,z} + // walk through the set, expanding each part, until + // the set ends. then, we'll expand the suffix. + // If the set only has a single member, then'll put the {} back + + // first, handle numeric sets, since they're easier + var numset = numericSet.Match(pattern); + if (numset.Success) + { + // console.error("numset", numset[1], numset[2]) + var suf = BraceExpand(pattern.Substring(numset.Length), options).ToList(); + int start = int.Parse(numset.Groups[1].Value), + end = int.Parse(numset.Groups[2].Value), + inc = start > end ? -1 : 1; + var retVal = new List(); + for (var w = start; w != (end + inc); w += inc) + { + // append all the suffixes + for (var ii = 0; ii < suf.Count; ii++) + { + retVal.Add(w.ToString() + suf[ii]); + } + } + return retVal; + } + + // ok, walk through the set + // We hope, somewhat optimistically, that there + // will be a } at the end. + // If the closing brace isn't found, then the pattern is + // interpreted as braceExpand("\\" + pattern) so that + // the leading \{ will be interpreted literally. + i = 1; // skip the \{ + int depth = 1; + var set = new List(); + string member = ""; + + for (i = 1; i < pattern.Length && depth > 0; i++) + { + var c = pattern[i]; + // console.error("", i, c) + + if (escaping) + { + escaping = false; + member += "\\" + c; + } + else + { + switch (c) + { + case '\\': + escaping = true; + continue; + + case '{': + depth++; + member += "{"; + continue; + + case '}': + depth--; + // if this closes the actual set, then we're done + if (depth == 0) + { + set.Add(member); + member = ""; + // pluck off the close-brace + break; + } + else + { + member += c; + continue; + } + + case ',': + if (depth == 1) + { + set.Add(member); + member = ""; + } + else + { + member += c; + } + continue; + + default: + member += c; + continue; + } // switch + } // else + } // for + + // now we've either finished the set, and the suffix is + // pattern.substr(i), or we have *not* closed the set, + // and need to escape the leading brace + if (depth != 0) + { + // console.error("didn't close", pattern) + return BraceExpand("\\" + pattern, options); + } + + // ["b", "c{d,e}","{f,g}h"] -> + // ["b", "cd", "ce", "fh", "gh"] + var addBraces = set.Count == 1; + + set = set.SelectMany(p => BraceExpand(p, options)).ToList(); + + if (addBraces) + set = set.Select(s => "{" + s + "}").ToList(); + // now attach the suffixes. + // x{y,z} -> ["xy", "xz"] + // console.error("set", set) + // console.error("suffix", pattern.substr(i)) + return BraceExpand(pattern.Substring(i), options).SelectMany(s1 => set.Select(s2 => s2 + s1)); + } + + private class PatternListEntry + { + public char Type { get; set; } + public int Start { get; set; } + public int ReStart { get; set; } + } + + abstract class ParseItem + { + public string Source { get; protected set; } + + public static readonly ParseItem Empty = new LiteralItem(""); + public static ParseItem Literal(string source) { return new LiteralItem(source); } + public abstract string RegexSource(Options options); + + public abstract bool Match(string input, Options options); + } + class LiteralItem : ParseItem + { + public LiteralItem(string source) { Source = source; } + public override string RegexSource(Options options) { return Regex.Escape(Source); } + public override bool Match(string input, Options options) + { + return input.Equals(Source, options.NoCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal); + } + } + class MagicItem : ParseItem + { + public MagicItem(string source, Options options) + { + Source = source; + regex = new Lazy(() => new Regex("^" + source + "$", options.RegexOptions)); + } + readonly Lazy regex; + + public override string RegexSource(Options options) { return Source; } + public override bool Match(string input, Options options) + { + return regex.Value.IsMatch(input); + } + } + class GlobStar : ParseItem + { + private GlobStar() { } + public static readonly ParseItem Instance = new GlobStar(); + + public override string RegexSource(Options options) + { + return options.NoGlobStar ? star + : options.Dot ? twoStarDot + : twoStarNoDot; + } + + public override bool Match(string input, Options options) { throw new NotSupportedException(); } + } + + static readonly Regex escapeCheck = new Regex(@"((?:\\{2})*)(\\?)\|"); + // parse a component of the expanded set. + // At this point, no pattern may contain "/" in it + // so we're going to return a 2d array, where each entry is the full + // pattern, split on '/', and then turned into a regular expression. + // A regexp is made at the end which joins each array with an + // escaped /, and another full one which joins each regexp with |. + // + // Following the lead of Bash 4.1, note that "**" only has special meaning + // when it is the *only* thing in a path portion. Otherwise, any series + // of * is equivalent to a single *. Globstar behavior is enabled by + // default, and can be disabled by setting options.noglobstar. + private Tuple Parse(string pattern, bool isSub) + { + // shortcuts + if (!options.NoGlobStar && pattern == "**") return Tuple.Create(GlobStar.Instance, false); + if (pattern == "") return Tuple.Create(ParseItem.Empty, false); + + string re = ""; + bool hasMagic = options.NoCase, escaping = false, inClass = false; + // ? => one single character + var patternListStack = new Stack(); + char plType; + char? stateChar = null; + + int reClassStart = -1, classStart = -1; + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + string patternStart = pattern[0] == '.' ? "" // anything + // not (start or / followed by . or .. followed by / or end) + : options.Dot ? "(?!(?:^|\\/)\\.{1,2}(?:$|\\/))" + : "(?!\\.)"; + + Action clearStateChar = () => + { + if (stateChar != null) + { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) + { + case '*': + re += star; + hasMagic = true; + break; + case '?': + re += qmark; + hasMagic = true; + break; + default: + re += "\\" + stateChar; + break; + } + stateChar = null; + } + }; + + for (var i = 0; i < pattern.Length; i++) + { + var c = pattern[i]; + //if (options.debug) { + // console.error("%s\t%s %s %j", pattern, i, re, c) + //} + + // skip over any that are escaped. + if (escaping && reSpecials.Contains(c)) + { + re += "\\" + c; + escaping = false; + continue; + } + + switch (c) + { + case '/': + // completely not allowed, even escaped. + // Should already be path-split by now. + return null; + + case '\\': + clearStateChar(); + escaping = true; + continue; + + // the various stateChar values + // for the 'extglob' stuff. + case '?': + case '*': + case '+': + case '@': + case '!': + //if (options.debug) { + // console.error("%s\t%s %s %j <-- stateChar", pattern, i, re, c) + //} + + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) + { + if (c == '!' && i == classStart + 1) c = '^'; + re += c; + continue; + } + + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + clearStateChar(); + stateChar = c; + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.NoExt) clearStateChar(); + continue; + + case '(': + if (inClass) + { + re += "("; + continue; + } + + if (stateChar == null) + { + re += "\\("; + continue; + } + + plType = stateChar.Value; + patternListStack.Push(new PatternListEntry { Type = plType, Start = i - 1, ReStart = re.Length }); + // negation is (?:(?!js)[^/]*) + re += stateChar == '!' ? "(?:(?!" : "(?:"; + stateChar = null; + continue; + + case ')': + if (inClass || !patternListStack.Any()) + { + re += "\\)"; + continue; + } + + hasMagic = true; + re += ')'; + plType = patternListStack.Pop().Type; + // negation is (?:(?!js)[^/]*) + // The others are (?:) + switch (plType) + { + case '!': + re += "[^/]*?)"; + break; + case '?': + case '+': + case '*': re += plType; break; + case '@': break; // the default anyway + } + continue; + + case '|': + if (inClass || !patternListStack.Any() || escaping) + { + re += "\\|"; + escaping = false; + continue; + } + + re += "|"; + continue; + + // these are mostly the same in regexp and glob + case '[': + // swallow any state-tracking char before the [ + clearStateChar(); + + if (inClass) + { + re += "\\" + c; + continue; + } + + inClass = true; + classStart = i; + reClassStart = re.Length; + re += c; + continue; + + case ']': + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i == classStart + 1 || !inClass) + { + re += "\\" + c; + escaping = false; + continue; + } + + // finish up the class. + hasMagic = true; + inClass = false; + re += c; + continue; + + default: + // swallow any state char that wasn't consumed + clearStateChar(); + + if (escaping) + { + // no need + escaping = false; + } + else if (reSpecials.Contains(c) && !(c == '^' && inClass)) + { + re += "\\"; + } + + re += c; + break; + } // switch + } // for + + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) + { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + string cs = pattern.Substring(classStart + 1); + var sp = this.Parse(cs, true); + re = re.Substring(0, reClassStart) + "\\[" + sp.Item1.Source; + hasMagic = hasMagic || sp.Item2; + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + while (patternListStack.Any()) + { + var pl = patternListStack.Pop(); + var tail = re.Substring(pl.ReStart + 3); + // maybe some even number of \, then maybe 1 \, followed by a | + tail = escapeCheck.Replace(tail, m => + { + string escape = m.Groups[2].Value; + // the | isn't already escaped, so escape it. + if (String.IsNullOrEmpty(escape)) escape = "\\"; + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return m.Groups[1].Value + m.Groups[1].Value + escape + "|"; + }); + + // console.error("tail=%j\n %s", tail, tail) + var t = pl.Type == '*' ? star + : pl.Type == '?' ? qmark + : "\\" + pl.Type; + + hasMagic = true; + re = re.Remove(pl.ReStart) + + t + "\\(" + + tail; + } + + // handle trailing things that only matter at the very end. + clearStateChar(); + if (escaping) + { + // trailing \\ + re += "\\\\"; + } + + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false; + switch (re[0]) + { + case '.': + case '[': + case '(': addPatternStart = true; break; + } + + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re != "" && hasMagic) re = "(?=.)" + re; + + if (addPatternStart) re = patternStart + re; + + // parsing just a piece of a larger pattern. + if (isSub) + { + return Tuple.Create(ParseItem.Literal(re), hasMagic); + } + + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) + { + return Tuple.Create(ParseItem.Literal(GlobUnescape(pattern)), false); + } + return new Tuple(new MagicItem(re, options), false); + } + + + Regex MakeRegex() + { + if (this.regexp != null || isError) return this.regexp; + + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + if (comment || empty || !set.Any()) + { + this.isError = true; + return null; + } + var re = String.Join("|", set.Select(pattern => + String.Join("\\/", pattern.Select(p => p.RegexSource(options)) + ))); + + // must match entire pattern + // ending in a * or ** will make it less strict. + re = "^(?:" + re + ")$"; + + // can match anything, as long as it's not this. + if (this.negate) re = "^(?!" + re + ").*$"; + + try + { + return this.regexp = new Regex(re, options.RegexOptions); + } + catch + { + this.isError = true; + return null; + } + } + + + private bool Match(string input, bool partial) + { + // console.error("match", f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false; + if (this.empty) return input == ""; + + if (input == "/" && partial) return true; + + // windows: need to use /, not \ + // On other platforms, \ is a valid (albeit bad) filename char. + + if (options.AllowWindowsPaths) + input = input.Replace("\\", "/"); + + // treat the test path as a set of pathparts. + var f = slashSplit.Split(input); + //if (options.debug) { + // console.error(this.pattern, "split", f) + //} + + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + + foreach (var pattern in set) + { + var hit = this.MatchOne(f, pattern.ToList(), partial); + if (hit) + { + if (options.FlipNegate) return true; + return !this.negate; + } + + } + + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.FlipNegate) return false; + return this.negate; + } + + // set partial to true to test if, for example, + // "/a/b" matches the start of "/*/b/*/d" + // Partial means, if you run out of file before you run + // out of pattern, then that's fine, as long as all + // the parts match. + bool MatchOne(IList file, IList pattern, bool partial) + { + + //if (options.debug) { + // console.error("matchOne", + // { "this": this + // , file: file + // , pattern: pattern }) + //} + + if (options.MatchBase && pattern.Count == 1) + { + file = new[] { file.Last(s => !String.IsNullOrEmpty(s)) }; + } + + //if (options.debug) { + // console.error("matchOne", file.length, pattern.length) + //} + int fi = 0, pi = 0; + for (; (fi < file.Count) && (pi < pattern.Count); fi++, pi++) + { + + //if (options.debug) { + // console.error("matchOne loop") + //} + ParseItem p = pattern[pi]; + string f = file[fi]; + + //if (options.debug) { + // console.error(pattern, p, f) + //} + + // should be impossible. + // some invalid regexp stuff in the set. + if (p == null) return false; + + if (p is GlobStar) + { + //if (options.debug) + // console.error('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + int fr = fi, pr = pi + 1; + if (pr == pattern.Count) + { + //if (options.debug) + // console.error('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for (; fi < file.Count; fi++) + { + if (file[fi] == "." || file[fi] == ".." || + (!options.Dot && !string.IsNullOrEmpty(file[fi]) && file[fi][0] == '.')) return false; + } + return true; + } + + // ok, let's see if we can swallow whatever we can. + while (fr < file.Count) + { + var swallowee = file[fr]; + + //if (options.debug) { + // console.error('\nglobstar while', + // file, fr, pattern, pr, swallowee) + //} + + // XXX remove this slice. Just pass the start index. + if (this.MatchOne(file.Skip(fr).ToList(), pattern.Skip(pr).ToList(), partial)) + { + //if (options.debug) + // console.error('globstar found match!', fr, file.Count, swallowee) + // found a match. + return true; + } + else + { + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee == "." || swallowee == ".." || + (!options.Dot && swallowee[0] == '.')) + { + //if (options.debug) + // console.error("dot detected!", file, fr, pattern, pr) + break; + } + + // ** swallows a segment, and continue. + //if (options.debug) + // console.error('globstar swallow a segment, and continue') + fr++; + } + } + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + if (partial) + { + // ran out of file + // console.error("\n>>> no match, partial?", file, fr, pattern, pr) + if (fr == file.Count) return true; + } + return false; + } + + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + if (!p.Match(f, options)) + return false; + } + + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* + + // now either we fell off the end of the pattern, or we're done. + if (fi == file.Count && pi == pattern.Count) + { + // ran out of pattern and filename at the same time. + // an exact hit! + return true; + } + else if (fi == file.Count) + { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial; + } + else if (pi == pattern.Count) + { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + var emptyFileEnd = (fi == file.Count - 1) && (file[fi] == ""); + return emptyFileEnd; + } + + // should be unreachable. + throw new InvalidOperationException("wtf?"); + } + + + // replace stuff like \* with * + static readonly Regex globUnescaper = new Regex(@"\\(.)"); + static string GlobUnescape(string s) + { + return globUnescaper.Replace(s, "$1"); + } + } +} diff --git a/Creator/Helper/Utils.cs b/Creator/Helper/Utils.cs index 6279542..b2f5b40 100644 --- a/Creator/Helper/Utils.cs +++ b/Creator/Helper/Utils.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using Minimatch; using Vestris.ResourceLib; namespace KattekerCreator.Helper @@ -73,25 +74,33 @@ namespace KattekerCreator.Helper #endif } - public static IEnumerable EnumerateFiles(string programFile, IEnumerable userdefinedFileExclusions = null) + public static IList EnumerateFiles(string path, IEnumerable userdefinedFileExclusions = null) { - if (string.IsNullOrWhiteSpace(programFile)) return null; - var directoryName = Path.GetDirectoryName(programFile); - if (directoryName == null) return null; - var files = new DirectoryInfo(directoryName).EnumerateFiles("*.*", SearchOption.AllDirectories); - var filter = FileExclusions(userdefinedFileExclusions).ToArray(); - return files.Where(x => !filter.Any(y => x.Name.EndsWith(y, StringComparison.Ordinal))); + if (string.IsNullOrWhiteSpace(path)) throw new ArgumentNullException(nameof(path)); + var result = new DirectoryInfo(path).EnumerateFiles("*.*", SearchOption.AllDirectories).ToList(); + var minimatchOptions = new Options {AllowWindowsPaths = true}; + foreach (var pattern in FileExclusions(userdefinedFileExclusions)) + { + var matcher = new Minimatcher(pattern, minimatchOptions); + for (var index = result.Count - 1; index >= 0; index--) + { + if (matcher.IsMatch(result[index].Name)) + { + result.Remove(result[index]); + } + } + } + + return result; } private static IEnumerable FileExclusions(IEnumerable userdefinedfileExclusions = null) { - yield return ".pdb"; - yield return ".tmp"; - yield return ".obj"; - yield return ".pch"; - yield return ".vshost.exe"; - yield return ".vshost.exe.config"; - yield return ".vshost.exe.manifest"; + yield return "*.pdb"; + yield return "*.tmp"; + yield return "*.obj"; + yield return "*.pch"; + yield return "*.vshost.exe*"; yield return "squirrelHelperInfo.json"; yield return "Katteker.config"; diff --git a/Creator/KattekerCreator.csproj b/Creator/KattekerCreator.csproj index e300511..2f26f63 100644 --- a/Creator/KattekerCreator.csproj +++ b/Creator/KattekerCreator.csproj @@ -55,6 +55,7 @@ + diff --git a/Creator/Program.cs b/Creator/Program.cs index af76eda..eed1285 100644 --- a/Creator/Program.cs +++ b/Creator/Program.cs @@ -183,7 +183,7 @@ namespace KattekerCreator }; var path = Path.GetDirectoryName(_appArguments.ProgramFile) ?? string.Empty; setupTmpl.Files.AddRange(additionalFiles); - var files = Utils.EnumerateFiles(_appArguments.ProgramFile).ToArray(); + var files = Utils.EnumerateFiles(path, _appArguments.Filter).ToArray(); setupTmpl.InstallSize = (long) Math.Floor(files.Sum(x => x.Length) / 1024f); setupTmpl.Files.AddRange(files.Select(x => new PhysicalFile(x.FullName, x.FullName.Replace(path, $"app-{_assemblyFileInfo.AssemblyVersion}")))); var transformText = setupTmpl.TransformText(); diff --git a/Example/App.xaml b/Example/App.xaml index acf7cf6..a2880cd 100644 --- a/Example/App.xaml +++ b/Example/App.xaml @@ -1,7 +1,6 @@  + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> diff --git a/Example/App.xaml.cs b/Example/App.xaml.cs index ca8f543..738402f 100644 --- a/Example/App.xaml.cs +++ b/Example/App.xaml.cs @@ -1,9 +1,16 @@ -namespace Example +using System.Windows; + +namespace Example { /// /// Interaction logic for App.xaml /// public partial class App { + protected override void OnStartup(StartupEventArgs e) + { + var bootstrapper = new Bootstrapper(); + bootstrapper.Run(); + } } } diff --git a/Example/Bootstrapper.cs b/Example/Bootstrapper.cs new file mode 100644 index 0000000..eab5baa --- /dev/null +++ b/Example/Bootstrapper.cs @@ -0,0 +1,16 @@ +using System.Windows; +using Autofac; +using Prism.Autofac; + +namespace Example +{ + public class Bootstrapper : AutofacBootstrapper + { + protected override DependencyObject CreateShell() => Container.Resolve(); + + protected override void InitializeShell() + { + (Shell as Window)?.Show(); + } + } +} \ No newline at end of file diff --git a/Example/Example.csproj b/Example/Example.csproj index 9de00c2..53a0543 100644 --- a/Example/Example.csproj +++ b/Example/Example.csproj @@ -41,8 +41,26 @@ Example.App + + ..\packages\Autofac.3.5.2\lib\net40\Autofac.dll + + + ..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll + + + ..\packages\Prism.Core.6.3.0\lib\net45\Prism.dll + + + ..\packages\Prism.Autofac.6.3.0\lib\net45\Prism.Autofac.Wpf.dll + + + ..\packages\Prism.Wpf.6.3.0\lib\net45\Prism.Wpf.dll + + + ..\packages\Prism.Wpf.6.3.0\lib\net45\System.Windows.Interactivity.dll + @@ -69,6 +87,7 @@ App.xaml Code + MainWindow.xaml Code @@ -95,6 +114,7 @@ PreserveNewest + SettingsSingleFileGenerator Settings.Designer.cs diff --git a/Example/Properties/AssemblyInfo.cs b/Example/Properties/AssemblyInfo.cs index d549a65..4111af7 100644 --- a/Example/Properties/AssemblyInfo.cs +++ b/Example/Properties/AssemblyInfo.cs @@ -49,5 +49,5 @@ using System.Windows; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.53")] -[assembly: AssemblyFileVersion("1.0.53")] +[assembly: AssemblyVersion("1.1.0")] +[assembly: AssemblyFileVersion("1.1.0")] diff --git a/Example/packages.config b/Example/packages.config new file mode 100644 index 0000000..73c410a --- /dev/null +++ b/Example/packages.config @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Katteker.Gui/UpdateWindow.cs b/Katteker.Gui/UpdateWindow.cs index d598542..6d7792d 100644 --- a/Katteker.Gui/UpdateWindow.cs +++ b/Katteker.Gui/UpdateWindow.cs @@ -83,9 +83,15 @@ namespace Katteker private async void UpdateWindow_Load(object sender, EventArgs e) { - var changelogContent = await ChangelogHelper.LoadChangelogAsync(Changelog, PublishPath).ConfigureAwait(false); + var changelogContent = "No changelog provided."; + if (Changelog != null) + { + changelogContent = await ChangelogHelper.LoadChangelogAsync(Changelog, PublishPath).ConfigureAwait(false); + } + changelogContent = changelogContent.ChangelogAsHtml(Path.GetExtension(Changelog)); Invoke(new Action(() => changelogBrowser.DocumentText = changelogContent)); + if (_entry == null) { Invoke(new Action(() => { WriteTitle(Resources.No_update_available); })); diff --git a/Katteker.Gui/UserInterface.cs b/Katteker.Gui/UserInterface.cs index 47e1bd8..3c41864 100644 --- a/Katteker.Gui/UserInterface.cs +++ b/Katteker.Gui/UserInterface.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; @@ -12,6 +13,7 @@ namespace Katteker public static class UserInterface { private static UpdateManager _manager; + private static Action _restartApp; /// /// Checks for Updates. @@ -38,6 +40,7 @@ namespace Katteker } var releases = (await _manager.CheckForUpdateAsync().ConfigureAwait(false)).ToArray(); + _restartApp = () => _manager.RestartApp(); if (releases.Any() || !isStartup) { var thread = new Thread(ThreadProcess); @@ -49,13 +52,13 @@ namespace Katteker private static void ThreadProcess(object argument) { - var entry = (ReleaseEntry) argument; + var entry = argument as ReleaseEntry; using (var window = new UpdateWindow(_manager, entry)) { var dialogResult = window.ShowDialog(); if (dialogResult == DialogResult.OK) { - _manager.RestartApp(); + _restartApp?.Invoke(); } } } diff --git a/Katteker.Test/Katteker.Test.csproj b/Katteker.Test/Katteker.Test.csproj index 1187ae2..5d872d4 100644 --- a/Katteker.Test/Katteker.Test.csproj +++ b/Katteker.Test/Katteker.Test.csproj @@ -10,7 +10,7 @@ Properties Katteker.Test Katteker.Test - v4.6.1 + v4.6.2 512 {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 15.0 @@ -20,6 +20,7 @@ UnitTest + true @@ -50,11 +51,72 @@ + + PreserveNewest + + + PreserveNewest + PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + {53d065eb-8818-4f60-9ebe-75705e1bb00d} + KattekerCreator + {A45E1C59-BA9E-452C-A5E2-50DE49D53E92} Katteker @@ -62,6 +124,21 @@ + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + diff --git a/Katteker.Test/KattekerLibTest.cs b/Katteker.Test/KattekerLibTest.cs index 2743f3a..6496efd 100644 --- a/Katteker.Test/KattekerLibTest.cs +++ b/Katteker.Test/KattekerLibTest.cs @@ -9,7 +9,8 @@ namespace Katteker.Test public class KattekerLibTest { private static readonly string BaseDir = AppDomain.CurrentDomain.BaseDirectory; - private static readonly string ExampleFile = Path.Combine(BaseDir, "testdata", "Example.exe"); + private static readonly string ExamplePath = Path.Combine(BaseDir, "testdata"); + private static readonly string ExampleFile = Path.Combine(ExamplePath, "Example.exe"); [Test] public void Sha1ChecksumOfFile() @@ -53,7 +54,14 @@ namespace Katteker.Test public void TestGetLocalAppDataDirectory() { var expected = Utility.GetLocalAppDataDirectory(); - Assert.IsTrue(expected.Contains("AppData\\Local")); + Assert.IsTrue(expected.Contains("AppData\\Local\\Programs")); + } + + [Test] + public void TestEnumerateFiles() + { + var list = KattekerCreator.Helper.Utils.EnumerateFiles(ExamplePath, new[] {"*.xml"}); + Assert.AreEqual(13, list.Count); } } } \ No newline at end of file diff --git a/Katteker.Test/testdata/Autofac.dll b/Katteker.Test/testdata/Autofac.dll new file mode 100644 index 0000000000000000000000000000000000000000..e4a596a9751fdb4c9674dd394418c96d77f9e081 GIT binary patch literal 203264 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 literal 0 HcmV?d00001 diff --git a/Katteker.Test/testdata/Autofac.xml b/Katteker.Test/testdata/Autofac.xml new file mode 100644 index 0000000..0b2a880 --- /dev/null +++ b/Katteker.Test/testdata/Autofac.xml @@ -0,0 +1,6923 @@ + + + + Autofac + + + + + Service used as a "flag" to indicate a particular component should be + automatically activated on container build. + + + + + Services are the lookup keys used to locate component instances. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Implements the operator ==. + + The left operand. + The right operand. + The result of the operator. + + + + Implements the operator !=. + + The left operand. + The right operand. + The result of the operator. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + The parameter is null. + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Gets a human-readable description of the service. + + The description. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + if the specified is not + and is an ; otherwise, . + + + + All services of this type are considered "equal." + + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . Always 0 for this type. + + + + All services of this type are considered "equal" and use the same hash code. + + + + + + Gets the service description. + + + Always returns AutoActivate. + + + + + Used with the WithMetadata configuration method to + associate key-value pairs with an . + + Interface with properties whose names correspond to + the property keys. + This feature was suggested by OJ Reeves (@TheColonial). + + + + Set one of the property values. + + The type of the property. + An expression that accesses the property to set. + The property value to set. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Cannot choose between multiple constructors with equal length {0} on type '{1}'. Select the constructor explicitly, with the UsingConstructor() configuration method, when the component is registered.. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to {0} ---> {1} (See inner exception for details.). + + + + + Well-known tags used in setting up matching lifetime scopes. + + + + + Tag used in setting up per-request lifetime scope registrations + (e.g., per-HTTP-request or per-API-request). + + + + + Interface providing fluent syntax for chaining module registrations. + + + + + Add a module to the container. + + The module to add. + + The to allow + additional chained module registrations. + + + + + Basic implementation of the + interface allowing registration of modules into a + in a fluent format. + + + + + The into which registrations will be made. + + + + + Initializes a new instance of the class. + + + The into which registrations will be made. + + + Thrown if is . + + + + + Add a module to the container. + + The module to add. + + The to allow + additional chained module registrations. + + + Thrown if is . + + + + + Support the System.Lazy<T, TMetadata> + types automatically whenever type T is registered with the container. + Metadata values come from the component registration's metadata. + When a dependency of a lazy type is used, the instantiation of the underlying + component will be delayed until the Value property is first accessed. + + + + + Allows registrations to be made on-the-fly when unregistered + services are requested (lazy registrations.) + + + + + Retrieve registrations for an unregistered service, to be used + by the container. + + The service that was requested. + A function that will return existing registrations for a service. + Registrations providing the service. + + If the source is queried for service s, and it returns a component that implements both s and s', then it + will not be queried again for either s or s'. This means that if the source can return other implementations + of s', it should return these, plus the transitive closure of other components implementing their + additional services, along with the implementation of s. It is not an error to return components + that do not implement . + + + + + Gets whether the registrations provided by this source are 1:1 adapters on top + of other components (I.e. like Meta, Func or Owned.) + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Lazy<T, TMetadata> Support. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The type '{0}' cannot be used as a metadata view. A metadata view must be a concrete class with a parameterless or dictionary constructor.. + + + + + Looks up a localized string similar to Export metadata for '{0}' is missing and no default value was supplied.. + + + + + Provides a value along with metadata describing the value. + + The type of the value. + An interface to which metadata values can be bound. + + + + Create a new instance. + + The value described by the instance. + The metadata describing the value. + + + + The value described by . + + + + + Metadata describing the value. + + + + + Support the + types automatically whenever type T is registered with the container. + Metadata values come from the component registration's metadata. + + + + + Finds constructors that match a finder function. + + + + + Find suitable constructors from which to select. + + + + + Finds suitable constructors on the target type. + + Type to search for constructors. + Suitable constructors. + + + + Initializes a new instance of the class. + + + Default to selecting all public constructors. + + + + + Initializes a new instance of the class. + + The finder function. + + + + Finds suitable constructors on the target type. + + Type to search for constructors. + Suitable constructors. + + + + Extension methods for configuring the . + + + + + Fluent method for setting the registration configuration on . + + The registration source to configure. + A configuration action that will run on any registration provided by the source. + + The with the registration configuration set. + + + + + Extension methods for registering instances with a container. + + + + + Registers modules found in an assembly. + + The builder to register the modules with. + The assemblies from which to register modules. + + Thrown if is . + + + The to allow + additional chained module registrations. + + + + + Registers modules found in an assembly. + + The module registrar that will make the registrations into the container. + The assemblies from which to register modules. + + Thrown if is . + + + The to allow + additional chained module registrations. + + + + + Registers modules found in an assembly. + + The builder to register the modules with. + The assemblies from which to register modules. + The type of the module to add. + + Thrown if is . + + + The to allow + additional chained module registrations. + + + + + Registers modules found in an assembly. + + The module registrar that will make the registrations into the container. + The assemblies from which to register modules. + The type of the module to add. + + Thrown if is . + + + The to allow + additional chained module registrations. + + + + + Registers modules found in an assembly. + + The builder to register the modules with. + The of the module to add. + The assemblies from which to register modules. + + Thrown if or is . + + + The to allow + additional chained module registrations. + + + + + Registers modules found in an assembly. + + The module registrar that will make the registrations into the container. + The of the module to add. + The assemblies from which to register modules. + + Thrown if or is . + + + The to allow + additional chained module registrations. + + + + + Add a module to the container. + + The builder to register the module with. + The module to add. + + Thrown if is . + + + The to allow + additional chained module registrations. + + + + + Add a module to the container. + + The module registrar that will make the registration into the container. + The module to add. + + Thrown if is . + + + The to allow + additional chained module registrations. + + + + + Add a module to the container. + + The builder to register the module with. + The module to add. + + Thrown if or is . + + + The to allow + additional chained module registrations. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Module.ThisAssembly is only available in modules that inherit directly from Module.. + + + + + Support the + type automatically whenever type T is registered with the container. + When a dependency of a lazy type is used, the instantiation of the underlying + component will be delayed until the Value property is first accessed. + + + + + Generates context-bound closures that represent factories from + a set of heuristics based on delegate type signatures. + + + + + Create a factory generator. + + The service that will be activated in + order to create the products of the factory. + The delegate to provide as a factory. + The parameter mapping mode to use. + + + + Create a factory generator. + + The component that will be activated in + order to create the products of the factory. + The delegate to provide as a factory. + The parameter mapping mode to use. + + + + Generates a factory delegate that closes over the provided context. + + The context in which the factory will be used. + Parameters provided to the resolve call for the factory itself. + A factory delegate that will work within the context. + + + + Generates a factory delegate that closes over the provided context. + + The context in which the factory will be used. + Parameters provided to the resolve call for the factory itself. + A factory delegate that will work within the context. + + + + Reflection activator data for concrete types. + + + + + Builder for reflection-based activators. + + + + + Specify a reflection activator for the given type. + + Type that will be activated. + + + + Get the implementation type. + + + + + The constructor finder for the registration. + + + + + The constructor selector for the registration. + + + + + The explicitly bound constructor parameters. + + + + + The explicitly bound properties. + + + + + Activator data that can provide an IInstanceActivator instance. + + + + + The instance activator based on the provided data. + + + + + Specify a reflection activator for the given type. + + Type that will be activated. + + + + The instance activator based on the provided data. + + + + + Parameterises the construction of a container by a . + + + + + No options - the default behavior for container building. + + + + + Prevents inclusion of standard modules like support for + relationship types including etc. + + + + + Does not call on components implementing + this interface (useful for module testing.) + + + + + Data structure used to construct registrations. + + The most specific type to which instances of the registration + can be cast. + Activator builder type. + Registration style type. + + + + Configure the component so that instances are never disposed by the container. + + A registration builder allowing further configuration of the component. + + + + Configure the component so that instances that support IDisposable are + disposed by the container (default.) + + A registration builder allowing further configuration of the component. + + + + Configure the component so that every dependent component or call to Resolve() + gets a new, unique instance (default.) + + A registration builder allowing further configuration of the component. + + + + Configure the component so that every dependent component or call to Resolve() + gets the same, shared instance. + + A registration builder allowing further configuration of the component. + + + + Configure the component so that every dependent component or call to Resolve() + within a single ILifetimeScope gets the same, shared instance. Dependent components in + different lifetime scopes will get different instances. + + A registration builder allowing further configuration of the component. + + + + Configure the component so that every dependent component or call to Resolve() within + a ILifetimeScope tagged with any of the provided tags value gets the same, shared instance. + Dependent components in lifetime scopes that are children of the tagged scope will + share the parent's instance. If no appropriately tagged scope can be found in the + hierarchy an is thrown. + + Tag applied to matching lifetime scopes. + A registration builder allowing further configuration of the component. + + + + Configure the component so that every dependent component or call to Resolve() + within a ILifetimeScope created by an owned instance gets the same, shared instance. + Dependent components in lifetime scopes that are children of the owned instance scope will + share the parent's instance. If no appropriate owned instance scope can be found in the + hierarchy an is thrown. + + Service type. + A registration builder allowing further configuration of the component. + + + + Configure the component so that every dependent component or call to Resolve() + within a ILifetimeScope created by an owned instance gets the same, shared instance. + Dependent components in lifetime scopes that are children of the owned instance scope will + share the parent's instance. If no appropriate owned instance scope can be found in the + hierarchy an is thrown. + + Service type. + A registration builder allowing further configuration of the component. + + + + Configure the component so that every dependent component or call to Resolve() + within a ILifetimeScope created by an owned instance gets the same, shared instance. + Dependent components in lifetime scopes that are children of the owned instance scope will + share the parent's instance. If no appropriate owned instance scope can be found in the + hierarchy an is thrown. + + The service type provided by the component. + Key to associate with the component. + A registration builder allowing further configuration of the component. + + + + Configure the component so that every dependent component or call to Resolve() + within a ILifetimeScope created by an owned instance gets the same, shared instance. + Dependent components in lifetime scopes that are children of the owned instance scope will + share the parent's instance. If no appropriate owned instance scope can be found in the + hierarchy an is thrown. + + Key to associate with the component. + The service type provided by the component. + A registration builder allowing further configuration of the component. + + + + Configure the services that the component will provide. The generic parameter(s) to As() + will be exposed as TypedService instances. + + Service type. + A registration builder allowing further configuration of the component. + + + + Configure the services that the component will provide. The generic parameter(s) to As() + will be exposed as TypedService instances. + + Service type. + Service type. + A registration builder allowing further configuration of the component. + + + + Configure the services that the component will provide. The generic parameter(s) to As() + will be exposed as TypedService instances. + + Service type. + Service type. + Service type. + A registration builder allowing further configuration of the component. + + + + Configure the services that the component will provide. + + Service types to expose. + A registration builder allowing further configuration of the component. + + + + Configure the services that the component will provide. + + Services to expose. + A registration builder allowing further configuration of the component. + + + + Provide a textual name that can be used to retrieve the component. + + Named service to associate with the component. + The service type provided by the component. + A registration builder allowing further configuration of the component. + + + + Provide a textual name that can be used to retrieve the component. + + Named service to associate with the component. + The service type provided by the component. + A registration builder allowing further configuration of the component. + + + + Provide a key that can be used to retrieve the component. + + Key to associate with the component. + The service type provided by the component. + A registration builder allowing further configuration of the component. + + + + Provide a key that can be used to retrieve the component. + + Key to associate with the component. + The service type provided by the component. + A registration builder allowing further configuration of the component. + + + + Add a handler for the Preparing event. This event allows manipulating of the parameters + that will be provided to the component. + + The event handler. + A registration builder allowing further configuration of the component. + + + + Add a handler for the Activating event. + + The event handler. + A registration builder allowing further configuration of the component. + + + + Add a handler for the Activated event. + + The event handler. + A registration builder allowing further configuration of the component. + + + + Configure the component so that any properties whose types are registered in the + container will be wired to instances of the appropriate service. + + Set wiring options such as circular dependency wiring support. + A registration builder allowing further configuration of the component. + + + + Associates data with the component. + + Key by which the data can be located. + The data value. + A registration builder allowing further configuration of the component. + + + + Associates data with the component. + + The extended properties to associate with the component. + A registration builder allowing further configuration of the component. + + + + Associates data with the component. + + A type with properties whose names correspond to the + property names to configure. + A registration builder allowing further configuration of the component. + + + + The activator data. + + + + + The registration style. + + + + + The registration data. + + + + + Delegates registration lookups to a specified registry. When write operations are applied, + initialises a new 'writeable' registry. + + + Safe for concurrent access by multiple readers. Write operations are single-threaded. + + + + + Provides component registrations according to the services they provide. + + + + + Attempts to find a default registration for the specified service. + + The service to look up. + The default registration for the service. + True if a registration exists. + + + + Determines whether the specified service is registered. + + The service to test. + True if the service is registered. + + + + Register a component. + + The component registration. + + + + Register a component. + + The component registration. + If true, existing defaults for the services provided by the + component will not be changed. + + + + Selects from the available registrations after ensuring that any + dynamic registration sources that may provide + have been invoked. + + The service for which registrations are sought. + Registrations supporting . + + + + Add a registration source that will provide registrations on-the-fly. + + The source to register. + + + + Enumerate the registered components. + + + + + Fired whenever a component is registered - either explicitly or via a + . + + + + + Gets the registration sources that are used by the registry. + + + + + True if the registry contains its own components; false if it is forwarding + registrations from another external registry. + + This property is used when walking up the scope tree looking for + registrations for a new customised scope. (See issue 336.) + + + + Fired when an is added to the registry. + + + + + Enables contravariant Resolve() for interfaces that have a single contravariant ('in') parameter. + + + interface IHandler<in TCommand> + { + void Handle(TCommand command); + } + + class Command { } + + class DerivedCommand : Command { } + + class CommandHandler : IHandler<Command> { ... } + + var builder = new ContainerBuilder(); + builder.RegisterSource(new ContravariantRegistrationSource()); + builder.RegisterType<CommandHandler>(); + var container = builder.Build(); + // Source enables this line, even though IHandler<Command> is the + // actual registered type. + var handler = container.Resolve<IHandler<DerivedCommand>>(); + handler.Handle(new DerivedCommand()); + + + + + Retrieve registrations for an unregistered service, to be used + by the container. + + The service that was requested. + A function that will return existing registrations for a service. + Registrations providing the service. + + If the source is queried for service s, and it returns a component that implements both s and s', then it + will not be queried again for either s or s'. This means that if the source can return other implementations + of s', it should return these, plus the transitive closure of other components implementing their + additional services, along with the implementation of s. It is not an error to return components + that do not implement . + + + + + Gets whether the registrations provided by this source are 1:1 adapters on top + of other components (I.e. like Meta, Func or Owned.) + + + + + Options that can be applied when autowiring properties on a component. (Multiple options can + be specified using bitwise 'or' - e.g. AllowCircularDependencies | PreserveSetValues. + + + + + Default behavior. Circular dependencies are not allowed; existing non-default + property values are overwritten. + + + + + Allows property-property and property-constructor circular dependency wiring. + This flag moves property wiring from the Activating to the Activated event. + + + + + If specified, properties that already have a non-default value will be left + unchanged in the wiring operation. + + + + + Static factory methods to simplify the creation and handling of IRegistrationBuilder{L,A,R}. + + + To create an for a specific type, use: + + var cr = RegistrationBuilder.ForType(t).CreateRegistration(); + + The full builder syntax is supported: + + var cr = RegistrationBuilder.ForType(t).Named("foo").ExternallyOwned().CreateRegistration(); + + + + + + Creates a registration builder for the provided delegate. + + Instance type returned by delegate. + Delegate to register. + A registration builder. + + + + Creates a registration builder for the provided delegate. + + Delegate to register. + Most specific type return value of delegate can be cast to. + A registration builder. + + + + Creates a registration builder for the provided type. + + Implementation type to register. + A registration builder. + + + + Creates a registration builder for the provided type. + + Implementation type to register. + A registration builder. + + + + Create an from a . + (There is no need to call + this method when registering components through a .) + + + When called on the result of one of the methods, + the returned registration will be different from the one the builder itself registers + in the container. + + + + var registration = RegistrationBuilder.ForType<Foo>().CreateRegistration(); + + + + + + The registration builder. + An IComponentRegistration. + + Thrown if is . + + + + + Create an IComponentRegistration from data. + + Id of the registration. + Registration data. + Activator. + Services provided by the registration. + An IComponentRegistration. + + + + Create an IComponentRegistration from data. + + Id of the registration. + Registration data. + Activator. + Services provided by the registration. + Optional; target registration. + An IComponentRegistration. + + Thrown if or is . + + + + + Register a component in the component registry. This helper method is necessary + in order to execute OnRegistered hooks and respect PreserveDefaults. + + Hoping to refactor this out. + + + + Component registry to make registration in. + Registration builder with data for new registration. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The type '{0}' is not assignable to service '{1}'.. + + + + + Adds registration syntax for less commonly-used features. + + + These features are in this namespace because they will remain accessible to + applications originally written against Autofac 1.4. In Autofac 2, this functionality + is implicitly provided and thus making explicit registrations is rarely necessary. + + + + + Registers a factory delegate. + + Container builder. + Factory type to generate. + Registration builder allowing the registration to be configured. + Factory delegates are provided automatically in Autofac 2, + and this method is generally not required. + + + + Registers a factory delegate. + + Container builder. + Factory type to generate. + The service that the delegate will return instances of. + Registration builder allowing the registration to be configured. + Factory delegates are provided automatically in Autofac 2, and + this method is generally not required. + + + + Registers a factory delegate. + + The type of the delegate. + Container builder. + The service that the delegate will return instances of. + Registration builder allowing the registration to be configured. + Factory delegates are provided automatically in Autofac 2, + and this method is generally not required. + + + + Registers a factory delegate. + + The type of the delegate. + Container builder. + Registration builder allowing the registration to be configured. + Factory delegates are provided automatically in Autofac 2, + and this method is generally not required. + + + + Changes the parameter mapping mode of the supplied delegate type to match + parameters by name. + + Factory delegate type + Activator data type + Registration style + Registration to change parameter mapping mode of. + Registration builder allowing the registration to be configured. + + Thrown if is . + + + + + Changes the parameter mapping mode of the supplied delegate type to match + parameters by position. + + Factory delegate type + Activator data type + Registration style + Registration to change parameter mapping mode of. + Registration builder allowing the registration to be configured. + + Thrown if is . + + + + + Changes the parameter mapping mode of the supplied delegate type to match + parameters by type. + + Factory delegate type + Activator data type + Registration style + Registration to change parameter mapping mode of. + Registration builder allowing the registration to be configured. + + Thrown if is . + + + + + Registers the type as a collection. If no services or names are specified, the + default services will be IList<T>, ICollection<T>, and IEnumerable<T> + + The type of the collection elements. + Container builder. + A unique name for the collection that can be passed to MemberOf(). + Registration builder allowing the registration to be configured. + Collections are provided automatically in Autofac 2, + and this method is generally not required. + + + + Registers the type as a collection. If no services or names are specified, the + default services will be IList<T>, ICollection<T>, and IEnumerable<T> + + The type of the collection elements. + Container builder. + A unique name for the collection that can be passed to MemberOf(). + Registration builder allowing the registration to be configured. + Collections are provided automatically in Autofac 2, + and this method is generally not required. + + + + Include the element explicitly in a collection configured using RegisterCollection. + + Registration limit type. + Registration style. + Activator data type. + Registration to export. + The collection name, as passed to RegisterCollection. + A registration builder allowing further configuration of the component. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Build() or Update() can only be called once on a ContainerBuilder.. + + + + + Looks up a localized string similar to An error occurred while attempting to automatically activate registration '{0}'. See the inner exception for information on the source of the failure.. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to A delegate registered to create instances of '{0}' returned null.. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Bound constructor '{0}'.. + + + + + Looks up a localized string similar to The binding cannot be instantiated.. + + + + + Looks up a localized string similar to An exception was thrown while invoking the constructor '{0}' on type '{1}'.. + + + + + Looks up a localized string similar to Cannot resolve parameter '{1}' of constructor '{0}'.. + + + + + Provides parameters that have a default value, set with an optional parameter + declaration in C# or VB. + + + + + Used in order to provide a value to a constructor parameter or property on an instance + being created by the container. + + + Not all parameters can be applied to all sites. + + + + + Returns true if the parameter is able to provide a value to a particular site. + + Constructor, method, or property-mutator parameter. + The component context in which the value is being provided. + If the result is true, the valueProvider parameter will + be set to a function that will lazily retrieve the parameter value. If the result is false, + will be set to null. + True if a value can be supplied; otherwise, false. + + + + Returns true if the parameter is able to provide a value to a particular site. + + Constructor, method, or property-mutator parameter. + The component context in which the value is being provided. + If the result is true, the valueProvider parameter will + be set to a function that will lazily retrieve the parameter value. If the result is false, + will be set to null. + True if a value can be supplied; otherwise, false. + + Thrown if is . + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The container's self-registration of context interfaces should never be activated as it is hard-wired into the LifetimeScope class.. + + + + + Marks a module as container-aware (for the purposes of attaching to diagnostic events.) + + + + + Initialise the module with the container into which it is being registered. + + The container. + + + + Fired when the activation process for a new instance is complete. + + + + + The context in which the activation occurred. + + + + + The component providing the instance. + + + + + The paramters provided when resolved. + + + + + The instance that will be used to satisfy the request. + + + + + Fired after the construction of an instance but before that instance + is shared with any other or any members are invoked on it. + + + + + The instance can be replaced if needed, e.g. by an interface proxy. + + The object to use instead of the activated instance. + + + + The context in which the activation occurred. + + + + + The component providing the instance. + + + + + The instance that will be used to satisfy the request. + + + + + The parameters supplied to the activator. + + + + + Interface supported by services that carry type information. + + + + + Return a new service of the same kind, but carrying + as the . + + The new service type. + A new service with the service type. + + + + Gets the type of the service. + + The type of the service. + + + + Identifies a service using a key in addition to its type. + + + + + Initializes a new instance of the class. + + Key of the service. + Type of the service. + + + + Indicates whether the current object is equal to another object of the same type. + + An object to compare with this object. + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + The parameter is null. + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Return a new service of the same kind, but carrying + as the . + + The new service type. + A new service with the service type. + + + + Gets or sets the key of the service. + + The key of the service. + + + + Gets the type of the service. + + The type of the service. + + + + Gets a human-readable description of the service. + + The description. + + + + Describes when a lifetime scope is beginning. + + + + + Create an instance of the class. + + The lifetime scope that is beginning. + + + + The lifetime scope that is beginning. + + + + + Describes when a lifetime scope is ending. + + + + + Create an instance of the class. + + The lifetime scope that is ending. + + + + The lifetime scope that is ending. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it has already been disposed.. + + + + + Fired when an is added to the registry. + + + + + Construct an instance of the class. + + The registry to which the source was added. + The source that was added. + + + + + The registry to which the source was added. + + + + + The source that was added. + + + + + Represents the process of finding a component during a resolve operation. + + + + + The component for which an instance is to be looked up. + + + + + The scope in which the instance will be looked up. + + + + + The parameters provided for new instance creation. + + + + + Raised when the lookup phase of the operation is ending. + + + + + Raised when the completion phase of an instance lookup operation begins. + + + + + Raised when the completion phase of an instance lookup operation ends. + + + + + Raised when the completion phase of an instance lookup operation begins. + + + + + Create an instance of the class. + + The instance lookup that is beginning the completion phase. + + + + The instance lookup operation that is beginning the completion phase. + + + + + Raised when the completion phase of an instance lookup operation ends. + + + + + Create an instance of the class. + + The instance lookup that is ending the completion phase. + + + + The instance lookup operation that is ending the completion phase. + + + + + Fired when an instance is looked up. + + + + + Create an instance of the class. + + The instance lookup that is ending. + True if a new instance was created as part of the operation. + + + + True if a new instance was created as part of the operation. + + + + + The instance lookup operation that is ending. + + + + + Fired when instance lookup is complete. + + + + The instance lookup that is ending. + + + + The instance lookup operation that is beginning. + + + + + Describes the commencement of a new resolve operation. + + + + + Create an instance of the class. + + The resolve operation that is beginning. + + + + The resolve operation that is beginning. + + + + + Wraps a component registration, switching its lifetime. + + + + + Base class for disposable objects. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Returns true if the current instance has been disposed; otherwise false; + + + + + Describes a logical component within the container. + + + + + Called by the container when an instance is required. + + The context in which the instance will be activated. + Parameters for activation. These may be modified by the event handler. + + + + Called by the container once an instance has been constructed. + + The context in which the instance was activated. + The parameters supplied to the activator. + The instance. + + + + Called by the container once an instance has been fully constructed, including + any requested objects that depend on the instance. + + The context in which the instance was activated. + The parameters supplied to the activator. + The instance. + + + + A unique identifier for this component (shared in all sub-contexts.) + This value also appears in Services. + + + + + The activator used to create instances. + + + + + The lifetime associated with the component. + + + + + Whether the component instances are shared or not. + + + + + Whether the instances of the component should be disposed by the container. + + + + + The services provided by the component. + + + + + Additional data associated with the component. + + + + + The component registration upon which this registration is based. + + + + + Fired when a new instance is required. The instance can be + provided in order to skip the regular activator, by setting the Instance property in + the provided event arguments. + + + + + Fired when a new instance is being activated. The instance can be + wrapped or switched at this time by setting the Instance property in + the provided event arguments. + + + + + Fired when the activation process for a new instance is complete. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Activator = {0}, Services = [{1}], Lifetime = {2}, Sharing = {3}, Ownership = {4}. + + + + + Pulls registrations from another component registry. + Excludes most auto-generated registrations - currently has issues with + collection registrations. + + + + + Create an external registry source that draws components from + . + + Component registry to pull registrations from. + + + + Retrieve registrations for an unregistered service, to be used + by the container. + + The service that was requested. + A function that will return existing registrations for a service. + Registrations providing the service. + + + + In this case because the components that are adapted do not come from the same + logical scope, we must return false to avoid duplicating them. + + + + + Switches components with a RootScopeLifetime (singletons) with + decorators exposing MatchingScopeLifetime targeting the specified scope. + + + + + Maps services onto the components that provide them. + + + The component registry provides services directly from components, + and also uses to generate components + on-the-fly or as adapters for other components. A component registry + is normally used through a , and not + directly by application code. + + + + + Protects instance variables from concurrent access. + + + + + External registration sources. + + + + + All registrations. + + + + + Keeps track of the status of registered services. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Attempts to find a default registration for the specified service. + + The service to look up. + The default registration for the service. + True if a registration exists. + + + + Determines whether the specified service is registered. + + The service to test. + True if the service is registered. + + + + Register a component. + + The component registration. + + + + Register a component. + + The component registration. + If true, existing defaults for the services provided by the + component will not be changed. + + + + Selects from the available registrations after ensuring that any + dynamic registration sources that may provide + have been invoked. + + The service for which registrations are sought. + Registrations supporting . + + + + Add a registration source that will provide registrations on-the-fly. + + The source to register. + + + + Enumerate the registered components. + + + + + Fired whenever a component is registered - either explicitly or via a + . + + + + + Gets the registration sources that are used by the registry. + + + + + True if the registry contains its own components; false if it is forwarding + registrations from another external registry. + + This property is used when walking up the scope tree looking for + registrations for a new customised scope. (See issue 336.) + + + + Fired when an is added to the registry. + + + + + Tracks the services known to the registry. + + + + + Used for bookkeeping so that the same source is not queried twice (may be null.) + + + + + Initializes a new instance of the class. + + The tracked service. + + + + The first time a service is requested, initialization (e.g. reading from sources) + happens. This value will then be set to true. Calling many methods on this type before + initialisation is an error. + + + + + The known implementations. + + + + + True if any implementations are known. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The operation is only valid during initialization.. + + + + + Looks up a localized string similar to The operation is not valid until the object is initialized.. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The activation has already been executed.. + + + + + Describes the commencement of a new resolve operation. + + + + + Create an instance of the class. + + The resolve operation that is ending. + If included, the exception causing the operation to end; otherwise, null. + + + + The exception causing the operation to end, or null. + + + + + The resolve operation that is ending. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Subclasses of Autofac.Service must override Object.Equals(). + + + + + Looks up a localized string similar to Subclasses of Autofac.Service must override Object.GetHashCode(). + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Collection Support (Arrays and Generic Collection Interfaces). + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Lazy<T> Support. + + + + + Describes the basic requirements for generating a lightweight adapter. + + + + + Create an instance of . + + The service that will be adapted from. + The adapter function. + + + + The adapter function. + + + + + The service to be adapted from. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Lightweight Adapter from {0} to {1}. + + + + + Looks up a localized string similar to The service {0} cannot be both the adapter's from and to parameters - these must differ.. + + + + + Internal implementation of the RegisterCollection/MemberOf-style collection feature. + + + + + Registration style for dynamic registrations. + + + + + Data used to create factory activators. + + + + + Create a new GeneratedFactoryActivatorData + + The type of the factory. + The service used to provide the products of the factory. + + + + Determines how the parameters of the delegate type are passed on + to the generated Resolve() call as Parameter objects. + For Func-based delegates, this defaults to ByType. Otherwise, the + parameters will be mapped by name. + + + + + Activator data that can provide an IInstanceActivator instance. + + + + + Hides standard Object members to make fluent interfaces + easier to read. + Based on blog post by @kzu here: + http://www.clariusconsulting.net/blogs/kzu/archive/2008/03/10/58301.aspx + + + + + Standard System.Object member. + + Standard result. + + + + Standard System.Object member. + + Standard result. + + + + Standard System.Object member. + + Standard result. + + + + Standard System.Object member. + + The other. + Standard result. + + + + Determines how the parameters of the delegate type are passed on + to the generated Resolve() call as Parameter objects. + + + + + Chooses parameter mapping based on the factory type. + For Func-based factories this is equivalent to ByType, for all + others ByName will be used. + + + + + Pass the parameters supplied to the delegate through to the + underlying registration as NamedParameters based on the parameter + names in the delegate type's formal argument list. + + + + + Pass the parameters supplied to the delegate through to the + underlying registration as TypedParameters based on the parameter + types in the delegate type's formal argument list. + + + + + Pass the parameters supplied to the delegate through to the + underlying registration as PositionalParameters based on the parameter + indices in the delegate type's formal argument list. + + + + + Provides components by lookup operations via an index (key) type. + + The type of the index. + The service provided by the indexed components. + + Retrieving a value given a key: + + IIndex<AccountType, IRenderer> accountRenderers = // ... + var renderer = accountRenderers[AccountType.User]; + + + + + + Get the value associated with if any is available. + + The key to look up. + The retrieved value. + True if a value associated with the key exists. + + + + Get the value associated with . + + The value to retrieve. + The associated value. + + + + + + + + + + + + + Support the + types automatically whenever type T is registered with the container. + Metadata values come from the component registration's metadata. + + + + + Provides a value along with a dictionary of metadata describing the value. + + The type of the value. + + + + Create a new instance. + + The value described by the instance. + The metadata describing the value. + + + + The value described by . + + + + + Metadata describing the value. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Meta<T> Support. + + + + + Looks up a localized string similar to Meta<T, TMetadata> Support. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The service '{0}' is not an open generic type.. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to {0} providing {1}. + + + + + Describes the activator for an open generic decorator. + + + + + Construct an . + + The decorator type. + The open generic service type to decorate. + + + + The open generic service type to decorate. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The service {0} cannot be both the adapter's from and to parameters - these must differ.. + + + + + Looks up a localized string similar to Open Generic Decorator {0} from {1} to {2}. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The type {0} is not an open generic type definition.. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The type '{0}' does not implement the interface '{1}'.. + + + + + Looks up a localized string similar to The implementation type '{0}' is not an open generic type definition.. + + + + + Looks up a localized string similar to The implementation type '{0}' does not support the interface '{1}'.. + + + + + Looks up a localized string similar to The service '{0}' is not an open generic type definition.. + + + + + Looks up a localized string similar to The service '{1}' is not assignable from implementation type '{0}'.. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Owned<T> Support. + + + + + Provides registrations on-the-fly for any concrete type not already registered with + the container. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + A predicate that selects types the source will register. + + + + Retrieve registrations for an unregistered service, to be used + by the container. + + The service that was requested. + A function that will return existing registrations for a service. + Registrations providing the service. + + + + Returns a that represents the current . + + + A that represents the current . + + 2 + + + + Gets whether the registrations provided by this source are 1:1 adapters on top + of other components (I.e. like Meta, Func or Owned.) + + + + + Gets or sets an expression used to configure generated registrations. + + + A that can be used to modify the behavior + of registrations that are generated by this source. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to "Resolve Anything" Support. + + + + + Activation data for types located by scanning assemblies. + + + + + Create an instance of . + + + + + The filters applied to the types from the scanned assembly. + + + + + Additional actions to be performed on the concrete type registrations. + + + + + Actions to be called once the scanning operation is complete. + + + + + Fired when the activation process for a new instance is complete. + + + + + Initializes a new instance of the class. + + The context. + The component. + The parameters. + The instance. + + + + The context in which the activation occurred. + + + + + The component providing the instance. + + + + + The paramters provided when resolved. + + + + + The instance that will be used to satisfy the request. + + + + + Fired after the construction of an instance but before that instance + is shared with any other or any members are invoked on it. + + + + + Initializes a new instance of the class. + + The context. + The component. + The parameters. + The instance. + + + + The instance can be replaced if needed, e.g. by an interface proxy. + + The object to use instead of the activated instance. + + + + The context in which the activation occurred. + + + + + The component providing the instance. + + + + + The instance that will be used to satisfy the request. + + + The instance can be replaced if needed, e.g. by an interface proxy. + + + + + The parameters supplied to the activator. + + + + + Activate instances using a delegate. + + + + + Base class for instance activators. + + + + + Create an instance activator that will return instances compatible + with . + + Most derived type to which instances can be cast. + + + + Gets a string representation of the activator. + + A string describing the activator. + + + + The most specific type that the component instances are known to be castable to. + + + + + Activates component instances. + + + + + Activate an instance in the provided context. + + Context in which to activate instances. + Parameters to the instance. + The activated instance. + + The context parameter here should probably be ILifetimeScope in order to reveal Disposer, + but will wait until implementing a concrete use case to make the decision + + + + + The most specific type that the component instances are known to be castable to. + + + + + Create a delegate activator. + + The most specific type to which activated instances can be cast. + Activation delegate. + + + + Activate an instance in the provided context. + + Context in which to activate instances. + Parameters to the instance. + The activated instance. + + The context parameter here should probably be ILifetimeScope in order to reveal Disposer, + but will wait until implementing a concrete use case to make the decision + + + + + Provides a pre-constructed instance. + + + + + Provide the specified instance. + + The instance to provide. + + + + Activate an instance in the provided context. + + Context in which to activate instances. + Parameters to the instance. + The activated instance. + + The context parameter here should probably be ILifetimeScope in order to reveal Disposer, + but will wait until implementing a concrete use case to make the decision + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Determines whether the activator disposes the instance that it holds. + Necessary because otherwise instances that are never resolved will never be + disposed. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The provided instance has already been used in an activation request. Did you combine a provided instance with non-root/single-instance lifetime/sharing?. + + + + + Supplies values based on the target parameter type. + + + + + Returns true if the parameter is able to provide a value to a particular site. + + Constructor, method, or property-mutator parameter. + The component context in which the value is being provided. + If the result is true, the valueProvider parameter will + be set to a function that will lazily retrieve the parameter value. If the result is false, + will be set to null. + True if a value can be supplied; otherwise, false. + + Thrown if or is . + + + + + Binds a constructor to the parameters that will be used when it is invoked. + + + + + Construct a new ConstructorParameterBinding. + + ConstructorInfo to bind. + Available parameters. + Context in which to construct instance. + + + + Invoke the constructor with the parameter bindings. + + The constructed instance. + + + Returns a System.String that represents the current System.Object. + A System.String that represents the current System.Object. + + + + The constructor on the target type. The actual constructor used + might differ, e.g. if using a dynamic proxy. + + + + + True if the binding is valid. + + + + + Describes the constructor parameter binding. + + + + + Selects the best constructor from a set of available constructors. + + + + + Selects the best constructor from the available constructors. + + Available constructors. + The best constructor. + + + + Selects a constructor based on its signature. + + + + + Match constructors with the provided signature. + + Signature to match. + + + + Selects the best constructor from the available constructors. + + Available constructors. + The best constructor. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to At least one binding must be provided in order to select a constructor.. + + + + + Looks up a localized string similar to The required constructor on type '{0}' with signature '{1}' is unavailable.. + + + + + Looks up a localized string similar to More than one constructor matches the signature '{0}'.. + + + + + Selects the constructor with the most parameters. + + + + + Selects the best constructor from the available constructors. + + Available constructors. + The best constructor. + A single unambiguous match could not be chosen. + + + + Uses reflection to activate instances of a type. + + + + + Create an activator for the provided type. + + Type to activate. + Constructor finder. + Constructor selector. + Parameters configured explicitly for this instance. + Properties configured explicitly for this instance. + + + + Activate an instance in the provided context. + + Context in which to activate instances. + Parameters to the instance. + The activated instance. + + The context parameter here should probably be ILifetimeScope in order to reveal Disposer, + but will wait until implementing a concrete use case to make the decision + + + + + The constructor finder. + + + + + The constructor selector. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to No constructors on type '{0}' can be found with the constructor finder '{1}'.. + + + + + Looks up a localized string similar to None of the constructors found with '{0}' on type '{1}' can be invoked with the available services and parameters:{2}. + + + + + Base class for parameters that provide a constant value. + + + + + Create a constant parameter that will apply to parameters matching + the supplied predicate. + + + + + + + Returns true if the parameter is able to provide a value to a particular site. + + Constructor, method, or property-mutator parameter. + The component context in which the value is being provided. + If the result is true, the valueProvider parameter will + be set to a function that will lazily retrieve the parameter value. If the result is false, + will be set to null. + True if a value can be supplied; otherwise, false. + + + + The value of the parameter. + + + + + Standard container implementation. + + + + + Creates, wires dependencies and manages lifetime for a set of components. + Most instances of are created + by a . + + + + // See ContainerBuilder for the definition of the builder variable + using (var container = builder.Build()) + { + var program = container.Resolve<Program>(); + program.Run(); + } + + + + Most functionality is provided by extension methods + on the inherited interface. + + + + + + + + + An tracks the instantiation of component instances. + It defines a boundary in which instances are shared and configured. + Disposing an will dispose the components that were + resolved through it. + + + + // See IContainer for definition of the container variable + using (var requestScope = container.BeginLifetimeScope()) + { + // Note that handler is resolved from requestScope, not + // from the container: + + var handler = requestScope.Resolve<IRequestHandler>(); + handler.Handle(request); + + // When requestScope is disposed, all resources used in processing + // the request will be released. + } + + + + All long-running applications should resolve components via an + . Choosing the duration of the lifetime is application- + specific. The standard Autofac WCF and ASP.NET/MVC integrations are already configured + to create and release s as appropriate. For example, the + ASP.NET integration will create and release an per HTTP + request. + Most functionality is provided by extension methods + on the inherited interface. + + + + + + + + + + + The context in which a service can be accessed or a component's + dependencies resolved. Disposal of a context will dispose any owned + components. + + + + + Resolve an instance of the provided registration within the context. + + The registration. + Parameters for the instance. + + The component instance. + + + + + + + Associates services with the components that provide them. + + + + + Begin a new nested scope. Component instances created via the new scope + will be disposed along with it. + + A new lifetime scope. + + + + Begin a new nested scope. Component instances created via the new scope + will be disposed along with it. + + The tag applied to the . + A new lifetime scope. + + + + Begin a new nested scope, with additional components available to it. + Component instances created via the new scope + will be disposed along with it. + + + The components registered in the sub-scope will be treated as though they were + registered in the root scope, i.e., SingleInstance() components will live as long + as the root scope. + + Action on a + that adds component registations visible only in the new scope. + A new lifetime scope. + + + + Begin a new nested scope, with additional components available to it. + Component instances created via the new scope + will be disposed along with it. + + + The components registered in the sub-scope will be treated as though they were + registered in the root scope, i.e., SingleInstance() components will live as long + as the root scope. + + The tag applied to the . + Action on a + that adds component registations visible only in the new scope. + A new lifetime scope. + + + + The disposer associated with this . + Component instances can be associated with it manually if required. + + Typical usage does not require interaction with this member- it + is used when extending the container. + + + + The tag applied to the . + + Tags allow a level in the lifetime hierarchy to be identified. + In most applications, tags are not necessary. + + + + + Fired when a new scope based on the current scope is beginning. + + + + + Fired when this scope is ending. + + + + + Fired when a resolve operation is beginning in this scope. + + + + + Create a new container. + + + + + Begin a new sub-scope. Instances created via the sub-scope + will be disposed along with it. + + A new lifetime scope. + + + + Begin a new sub-scope. Instances created via the sub-scope + will be disposed along with it. + + The tag applied to the . + A new lifetime scope. + + + + Begin a new nested scope, with additional components available to it. + Component instances created via the new scope + will be disposed along with it. + + Action on a + that adds component registations visible only in the new scope. + A new lifetime scope. + + + + Begin a new nested scope, with additional components available to it. + Component instances created via the new scope + will be disposed along with it. + + The tag applied to the . + Action on a + that adds component registations visible only in the new scope. + A new lifetime scope. + + + + Resolve an instance of the provided registration within the context. + + The registration. + Parameters for the instance. + + The component instance. + + + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Gets the service object of the specified type. + + An object that specifies the type of service object + to get. + + A service object of type .-or- null if there is + no service object of type . + + + + + The disposer associated with this container. Instances can be associated + with it manually if required. + + + + + Tag applied to the lifetime scope. + + The tag applied to this scope and the contexts generated when + it resolves component dependencies. + + + + Fired when a new scope based on the current scope is beginning. + + + + + Fired when this scope is ending. + + + + + Fired when a resolve operation is beginning in this scope. + + + + + Associates services with the components that provide them. + + + + + Base exception type thrown whenever the dependency resolution process fails. This is a fatal + exception, as Autofac is unable to 'roll back' changes to components that may have already + been made during the operation. For example, 'on activated' handlers may have already been + fired, or 'single instance' components partially constructed. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Gets a message that describes the current exception. + + + The error message that explains the reason for the exception, or an empty string(""). + + + + + Maintains a set of objects to dispose, and disposes them in the reverse order + from which they were added when the Disposer is itself disposed. + + + + + Provided on an object that will dispose of other objects when it is + itself disposed. + + + + + Adds an object to the disposer. When the disposer is + disposed, so will the object be. + + The instance. + + + + Contents all implement IDisposable. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Adds an object to the disposer. When the disposer is + disposed, so will the object be. + + The instance. + + + + Locates the lifetime to which instances of a component should be attached. + + + + + Given the most nested scope visible within the resolve operation, find + the scope for the component. + + The most nested visible scope. + The scope for the component. + + + + Represents a set of components and related functionality + packaged together. + + + + + Apply the module to the component registry. + + Component registry to apply configuration to. + + + + Determines when instances supporting IDisposable are disposed. + + + + + The lifetime scope does not dispose the instances. + + + + + The instances are disposed when the lifetime scope is disposed. + + + + + Determines whether instances are shared within a lifetime scope. + + + + + Each request for an instance will return a new object. + + + + + Each request for an instance will return the same object. + + + + + Defines a nested structure of lifetimes. + + + + + Try to retrieve an instance based on a GUID key. If the instance + does not exist, invoke to create it. + + Key to look up. + Creation function. + An instance. + + + + The root of the sharing hierarchy. + + + + + The parent of this node of the hierarchy, or null. + + + + + Attaches the instance's lifetime to the current lifetime scope. + + + + + Given the most nested scope visible within the resolve operation, find + the scope for the component. + + The most nested visible scope. + The scope for the component. + + + + Lifetime scope implementation. + + + + + Protects shared instances from concurrent access. Other members and the base class are threadsafe. + + + + + The tag applied to root scopes when no other tag is specified. + + + + + Create a lifetime scope for the provided components and nested beneath a parent. + + The tag applied to the . + Components used in the scope. + Parent scope. + + + + Create a root lifetime scope for the provided components. + + The tag applied to the . + Components used in the scope. + + + + Create a root lifetime scope for the provided components. + + Components used in the scope. + + + + Begin a new anonymous sub-scope. Instances created via the sub-scope + will be disposed along with it. + + A new lifetime scope. + + + + Begin a new tagged sub-scope. Instances created via the sub-scope + will be disposed along with it. + + The tag applied to the . + A new lifetime scope. + + + + Begin a new anonymous sub-scope, with additional components available to it. + Component instances created via the new scope + will be disposed along with it. + + Action on a + that adds component registations visible only in the new scope. + A new lifetime scope. + + IContainer cr = // ... + using (var lifetime = cr.BeginLifetimeScope(builder => { + builder.RegisterType<Foo>(); + builder.RegisterType<Bar>().As<IBar>(); }) + { + var foo = lifetime.Resolve<Foo>(); + } + + + + + Begin a new tagged sub-scope, with additional components available to it. + Component instances created via the new scope + will be disposed along with it. + + The tag applied to the . + Action on a + that adds component registations visible only in the new scope. + A new lifetime scope. + + IContainer cr = // ... + using (var lifetime = cr.BeginLifetimeScope("unitOfWork", builder => { + builder.RegisterType<Foo>(); + builder.RegisterType<Bar>().As<IBar>(); }) + { + var foo = lifetime.Resolve<Foo>(); + } + + + + + Resolve an instance of the provided registration within the context. + + The registration. + Parameters for the instance. + + The component instance. + + + + + + + Try to retrieve an instance based on a GUID key. If the instance + does not exist, invoke to create it. + + Key to look up. + Creation function. + An instance. + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Gets the service object of the specified type. + + An object that specifies the type of service object + to get. + + A service object of type .-or- null if there is + no service object of type . + + + + + The parent of this node of the hierarchy, or null. + + + + + The root of the sharing hierarchy. + + + + + The disposer associated with this container. Instances can be associated + with it manually if required. + + + + + Tag applied to the lifetime scope. + + The tag applied to this scope and the contexts generated when + it resolves component dependencies. + + + + Associates services with the components that provide them. + + + + + Fired when a new scope based on the current scope is beginning. + + + + + Fired when this scope is ending. + + + + + Fired when a resolve operation is beginning in this scope. + + + + + Attaches the component's lifetime to scopes matching a supplied expression. + + + + + Match scopes by comparing tags for equality. + + The tags applied to matching scopes. + + + + Given the most nested scope visible within the resolve operation, find + the scope for the component. + + The most nested visible scope. + The scope for the component. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to No scope with a Tag matching '{0}' is visible from the scope in which the instance was requested. This generally indicates that a component registered as per-HTTP request is being requested by a SingleInstance() component (or a similar scenario.) Under the web integration always request dependencies from the DependencyResolver.Current or ILifetimeScopeProvider.RequestLifetime, never from the container itself.. + + + + + Attaches the component's lifetime to the root scope. + + + + + Given the most nested scope visible within the resolve operation, find + the scope for the component. + + The most nested visible scope. + The scope for the component. + + + + A property identified by name. When applied to a reflection-based + component, the name will be matched against property names. + + + + + Create a with the specified constant value. + + The name of the property. + The property value. + + + + The name of the property. + + + + + Fired before the activation process to allow parameters to be changed or an alternative + instance to be provided. + + + + + Initializes a new instance of the class. + + The context. + The component. + The parameters. + + + + The context in which the activation is occurring. + + + + + The component providing the instance being activated. + + + + + The parameters supplied to the activator. + + + + + A service was requested that cannot be provided by the container. To avoid this exception, either register a component + to provide the required service, check for service registration using IsRegistered(), or use the ResolveOptional() + method to resolve an optional dependency. + + This exception is fatal. See for more information. + + + + Initializes a new instance of the class. + + The service. + + + + Initializes a new instance of the class. + + The service. + The inner exception. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The requested service '{0}' has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.. + + + + + Information about the ocurrence of a component being registered + with a container. + + + + + Create a new instance with a valid container and component registration. + + The container into which the registration + was made. + The component registration. + + + + The container into which the registration was made. + + + + + The component registration. + + + + + Describes a logical component within the container. + + + + + Create a new component registration. + + Unique identifier for the component. + Activator used to activate instances. + Determines how the component will be associated with its lifetime. + Whether the component is shared within its lifetime scope. + Whether the component instances are disposed at the end of their lifetimes. + Services the component provides. + Data associated with the component. + + + + Create a new component registration. + + Unique identifier for the component. + Activator used to activate instances. + Determines how the component will be associated with its lifetime. + Whether the component is shared within its lifetime scope. + Whether the component instances are disposed at the end of their lifetimes. + Services the component provides. + Data associated with the component. + The component registration upon which this registration is based. + + + + Called by the container when an instance is required. + + The context in which the instance will be activated. + Parameters for activation. + + + + Called by the container once an instance has been constructed. + + The context in which the instance was activated. + The parameters supplied to the activator. + The instance. + + + + Called by the container once an instance has been fully constructed, including + any requested objects that depend on the instance. + + The context in which the instance was activated. + The parameters supplied to the activator. + The instance. + + + + Describes the component in a human-readable form. + + A description of the component. + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + The component registration upon which this registration is based. + If this registration was created directly by the user, returns this. + + + + + A unique identifier for this component (shared in all sub-contexts.) + This value also appears in Services. + + + + + The activator used to create instances. + + + + + The lifetime associated with the component. + + + + + Whether the component instances are shared or not. + + + + + Whether the instances of the component should be disposed by the container. + + + + + The services provided by the component. + + + + + Additional data associated with the component. + + + + + Fired when a new instance is required. The instance can be + provided in order to skip the regular activator, by setting the Instance property in + the provided event arguments. + + + + + Fired when a new instance is being activated. The instance can be + wrapped or switched at this time by setting the Instance property in + the provided event arguments. + + + + + Fired when the activation process for a new instance is complete. + + + + + Catch circular dependencies that are triggered by post-resolve processing (e.g. 'OnActivated') + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Circular component dependency detected: {0}.. + + + + + Looks up a localized string similar to Probable circular dependency between factory-scoped components. Chain includes '{0}'. + + + + + An is a component context that sequences and monitors the multiple + activations that go into producing a single requested object graph. + + + + + Get or create and share an instance of in the . + + The scope in the hierarchy in which the operation will begin. + The component to resolve. + Parameters for the component. + The component instance. + + + + Raised when the entire operation is complete. + + + + + Raised when an instance is looked up within the operation. + + + + + A is a component context that sequences and monitors the multiple + activations that go into producing a single requested object graph. + + + + + Create an instance of in the provided scope. + + The most nested scope in which to begin the operation. The operation + can move upward to less nested scopes as components with wider sharing scopes are activated + + + + Resolve an instance of the provided registration within the context. + + The registration. + Parameters for the instance. + + The component instance. + + + + + + + Execute the complete resolve operation. + + + + + Continue building the object graph by instantiating in the + current . + + The current scope of the operation. + The component to activate. + The parameters for the component. + The resolved instance. + + + + + Associates services with the components that provide them. + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to An exception was thrown while executing a resolve operation. See the InnerException for details.. + + + + + Looks up a localized string similar to Probable circular dependency between factory-scoped components. Chain includes '{0}'. + + + + + Looks up a localized string similar to This resolve operation has already ended. When registering components using lambdas, the IComponentContext 'c' parameter to the lambda cannot be stored. Instead, either resolve IComponentContext again from 'c', or resolve a Func<> based factory to create subsequent components from.. + + + + + Identifies a service according to a type to which it can be assigned. + + + + + Initializes a new instance of the class. + + Type of the service. + + + + Indicates whether the current object is equal to another object of the same type. + + An object to compare with this object. + + true if the current object is equal to the parameter; otherwise, false. + + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + The parameter is null. + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Return a new service of the same kind, but carrying + as the . + + The new service type. + A new service with the service type. + + + + Gets the type of the service. + + The type of the service. + + + + Gets a human-readable description of the service. + + The description. + + + + A handy unique service identifier type - all instances will be regarded as unequal. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The id. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + The parameter is null. + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Provides a programmer-readable description of the identifying feature of the service. + + + + + + Registration source providing implicit collection/list/enumerable support. + + + + This registration source provides enumerable support to allow resolving + the set of all registered services of a given type. + + + What may not be immediately apparent is that it also means any time there + are no items of a particular type registered, it will always return an + empty set rather than or throwing an exception. + This is by design. + + + Consider the [possibly majority] use case where you're resolving a set + of message handlers or event handlers from the container. If there aren't + any handlers, you want an empty set - not or + an exception. It's valid to have no handlers registered. + + + This implicit support means other areas (like MVC support or manual + property injection) must take care to only request enumerable values they + expect to get something back for. In other words, "Don't ask the container + for something you don't expect to resolve." + + + + + + Retrieve registrations for an unregistered service, to be used + by the container. + + The service that was requested. + A function that will return existing registrations for a service. + Registrations providing the service. + + + + Generates activators for open generic types. + + + + + Represents a dependency that can be released by the dependent component. + + The service provided by the dependency. + + + Autofac automatically provides instances of whenever the + service is registered. + + + It is not necessary for , or the underlying component, to implement . + Disposing of the object is the correct way to handle cleanup of the dependency, + as this will dispose of any other components created indirectly as well. + + + When is resolved, a new is created for the + underlying , and tagged with the service matching , + generally a . This means that shared instances can be tied to this + scope by registering them as InstancePerMatchingLifetimeScope(new TypedService(typeof(T))). + + + + The component D below is disposable and implements IService: + + public class D : IService, IDisposable + { + // ... + } + + The dependent component C can dispose of the D instance whenever required by taking a dependency on + : + + public class C + { + IService _service; + + public C(Owned<IService> service) + { + _service = service; + } + + void DoWork() + { + _service.Value.DoSomething(); + } + + void OnFinished() + { + _service.Dispose(); + } + } + + In general, rather than depending on directly, components will depend on + System.Func<Owned<T>> in order to create and dispose of other components as required. + + + + + Create an instance of . + + The value representing the instance. + An IDisposable interface through which ownership can be released. + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + The owned value. + + + + + Generates registrations for services of type whenever the service + T is available. + + + + + Retrieve registrations for an unregistered service, to be used + by the container. + + The service that was requested. + A function that will return existing registrations for a service. + Registrations providing the service. + + + + When implemented by a component, an instance of the component will be resolved + and started as soon as the container is built. Autofac will not call the Start() + method when subsequent instances are resolved. If this behavior is required, use + an OnActivated() event handler instead. + + + For equivalent "Stop" functionality, implement . Autofac + will always dispose a component before any of its dependencies (except in the presence + of circular dependencies, in which case the components in the cycle are disposed in + reverse-construction order.) + + + + + Perform once-off startup processing. + + + + + Base class for user-defined modules. Modules can add a set of releated components + to a container () or attach cross-cutting functionality + to other components (. + Modules are given special support in the XML configuration feature - see + http://code.google.com/p/autofac/wiki/StructuringWithModules. + + Provides a user-friendly way to implement + via . + + Defining a module: + + public class DataAccessModule : Module + { + public string ConnectionString { get; set; } + + public override void Load(ContainerBuilder moduleBuilder) + { + moduleBuilder.RegisterGeneric(typeof(MyRepository<>)) + .As(typeof(IRepository<>)) + .InstancePerMatchingLifetimeScope(WebLifetime.Request); + + moduleBuilder.Register(c => new MyDbConnection(ConnectionString)) + .As<IDbConnection>() + .InstancePerMatchingLifetimeScope(WebLifetime.Request); + } + } + + Using the module: + + var builder = new ContainerBuilder(); + builder.RegisterModule(new DataAccessModule { ConnectionString = "..." }); + var container = builder.Build(); + var customers = container.Resolve<IRepository<Customer>>(); + + + + + + Apply the module to the component registry. + + Component registry to apply configuration to. + + + + Override to add registrations to the container. + + + Note that the ContainerBuilder parameter is unique to this module. + + The builder through which components can be + registered. + + + + Override to attach module-specific functionality to a + component registration. + + This method will be called for all existing and future component + registrations - ordering is not important. + The component registry. + The registration to attach functionality to. + + + + Override to perform module-specific processing on a registration source. + + This method will be called for all existing and future sources + - ordering is not important. + The component registry into which the source was added. + The registration source. + + + + The assembly in which the concrete module type is located. To avoid bugs whereby deriving from a module will + change the target assembly, this property can only be used by modules that inherit directly from + . + + + + + Configure the component so that instances are never disposed by the container. + + A registration builder allowing further configuration of the component. + + + + Configure the component so that instances that support IDisposable are + disposed by the container (default.) + + A registration builder allowing further configuration of the component. + + + + Configure the component so that every dependent component or call to Resolve() + gets a new, unique instance (default.) + + A registration builder allowing further configuration of the component. + + + + Configure the component so that every dependent component or call to Resolve() + gets the same, shared instance. + + A registration builder allowing further configuration of the component. + + + + Configure the component so that every dependent component or call to Resolve() + within a single ILifetimeScope gets the same, shared instance. Dependent components in + different lifetime scopes will get different instances. + + A registration builder allowing further configuration of the component. + + + + Configure the component so that every dependent component or call to Resolve() within + a ILifetimeScope tagged with any of the provided tags value gets the same, shared instance. + Dependent components in lifetime scopes that are children of the tagged scope will + share the parent's instance. If no appropriately tagged scope can be found in the + hierarchy an is thrown. + + Tag applied to matching lifetime scopes. + A registration builder allowing further configuration of the component. + + + + Configure the component so that every dependent component or call to Resolve() + within a ILifetimeScope created by an owned instance gets the same, shared instance. + Dependent components in lifetime scopes that are children of the owned instance scope will + share the parent's instance. If no appropriate owned instance scope can be found in the + hierarchy an is thrown. + + The service type provided by the component. + A registration builder allowing further configuration of the component. + + + + Configure the component so that every dependent component or call to Resolve() + within a ILifetimeScope created by an owned instance gets the same, shared instance. + Dependent components in lifetime scopes that are children of the owned instance scope will + share the parent's instance. If no appropriate owned instance scope can be found in the + hierarchy an is thrown. + + The service type provided by the component. + A registration builder allowing further configuration of the component. + + + + Configure the component so that every dependent component or call to Resolve() + within a ILifetimeScope created by an owned instance gets the same, shared instance. + Dependent components in lifetime scopes that are children of the owned instance scope will + share the parent's instance. If no appropriate owned instance scope can be found in the + hierarchy an is thrown. + + The service type provided by the component. + Key to associate with the component. + A registration builder allowing further configuration of the component. + + + + Configure the component so that every dependent component or call to Resolve() + within a ILifetimeScope created by an owned instance gets the same, shared instance. + Dependent components in lifetime scopes that are children of the owned instance scope will + share the parent's instance. If no appropriate owned instance scope can be found in the + hierarchy an is thrown. + + Key to associate with the component. + The service type provided by the component. + A registration builder allowing further configuration of the component. + + + + Configure the services that the component will provide. The generic parameter(s) to As() + will be exposed as TypedService instances. + + Service type. + A registration builder allowing further configuration of the component. + + + + Configure the services that the component will provide. The generic parameter(s) to As() + will be exposed as TypedService instances. + + Service type. + Service type. + A registration builder allowing further configuration of the component. + + + + Configure the services that the component will provide. The generic parameter(s) to As() + will be exposed as TypedService instances. + + Service type. + Service type. + Service type. + A registration builder allowing further configuration of the component. + + + + Configure the services that the component will provide. + + Service types to expose. + A registration builder allowing further configuration of the component. + + + + Configure the services that the component will provide. + + Services to expose. + A registration builder allowing further configuration of the component. + + + + Provide a textual name that can be used to retrieve the component. + + Named service to associate with the component. + The service type provided by the component. + A registration builder allowing further configuration of the component. + + + + Provide a textual name that can be used to retrieve the component. + + Named service to associate with the component. + The service type provided by the component. + A registration builder allowing further configuration of the component. + + + + Provide a key that can be used to retrieve the component. + + Key to associate with the component. + The service type provided by the component. + A registration builder allowing further configuration of the component. + + + + Provide a key that can be used to retrieve the component. + + Key to associate with the component. + The service type provided by the component. + A registration builder allowing further configuration of the component. + + + + Add a handler for the Preparing event. This event allows manipulating of the parameters + that will be provided to the component. + + The event handler. + A registration builder allowing further configuration of the component. + + + + Add a handler for the Activating event. + + The event handler. + A registration builder allowing further configuration of the component. + + + + Add a handler for the Activated event. + + The event handler. + A registration builder allowing further configuration of the component. + + + + Configure the component so that any properties whose types are registered in the + container will be wired to instances of the appropriate service. + + Set wiring options such as circular dependency wiring support. + A registration builder allowing further configuration of the component. + + + + Associates data with the component. + + Key by which the data can be located. + The data value. + A registration builder allowing further configuration of the component. + + + + Associates data with the component. + + The extended properties to associate with the component. + A registration builder allowing further configuration of the component. + + + + Associates data with the component. + + A type with properties whose names correspond to the + property names to configure. + A registration builder allowing further configuration of the component. + + + + The activator data. + + + + + The registration style. + + + + + The registration data. + + + + + Data common to all registrations made in the container, both direct (IComponentRegistration) + and dynamic (IRegistrationSource.) + + + + + Construct a RegistrationData instance. + + The default service that will be used if no others + are added. + + + + Add multiple services for the registration, overriding the default. + + The services to add. + If an empty collection is specified, this will still + clear the default service. + + + + Add a service to the registration, overriding the default. + + The service to add. + + + + Copies the contents of another RegistrationData object into this one. + + The data to copy. + When true, the default service + will be changed to that of the other. + + Thrown if is . + + + + + Empties the configured services. + + + + + The services explicitly assigned to the component. + + + + + The instance ownership assigned to the component. + + + + + The lifetime assigned to the component. + + + + + The sharing mode assigned to the component. + + + + + Extended properties assigned to the component. + + + + + Handlers for the Preparing event. + + + + + Handlers for the Activating event. + + + + + Handlers for the Activated event. + + + + + Adds registration syntax to the type. + + + + + Add a component to the container. + + The builder to register the component with. + The component to add. + + + + Add a registration source to the container. + + The builder to register the registration source via. + The registration source to add. + + + + Register an instance as a component. + + The type of the instance. + Container builder. + The instance to register. + Registration builder allowing the registration to be configured. + If no services are explicitly specified for the instance, the + static type will be used as the default service (i.e. *not* instance.GetType()). + + + + Register a component to be created through reflection. + + The type of the component implementation. + Container builder. + Registration builder allowing the registration to be configured. + + + + Register a component to be created through reflection. + + The type of the component implementation. + Container builder. + Registration builder allowing the registration to be configured. + + + + Register a delegate as a component. + + The type of the instance. + Container builder. + The delegate to register. + Registration builder allowing the registration to be configured. + + + + Register a delegate as a component. + + The type of the instance. + Container builder. + The delegate to register. + Registration builder allowing the registration to be configured. + + + + Register an un-parameterised generic type, e.g. Repository<>. + Concrete types will be made as they are requested, e.g. with Resolve<Repository<int>>(). + + Container builder. + The open generic implementation type. + Registration builder allowing the registration to be configured. + + + + Specifies that the component being registered should only be made the default for services + that have not already been registered. + + Registration limit type. + Registration style. + Activator data type. + Registration to set service mapping on. + Registration builder allowing the registration to be configured. + + + + Specifies that the components being registered should only be made the default for services + that have not already been registered. + + Registration limit type. + Registration style. + Registration to set service mapping on. + Registration builder allowing the registration to be configured. + + + + Register the types in an assembly. + + Container builder. + The assemblies from which to register types. + Registration builder allowing the registration to be configured. + + + + Register the types in a list. + + Container builder. + The types to register. + Registration builder allowing the registration to be configured. + + + + Specifies a subset of types to register from a scanned assembly. + + Registration limit type. + Registration style. + Activator data type. + Registration to filter types from. + Predicate that returns true for types to register. + Registration builder allowing the registration to be configured. + + + + Specifies how a type from a scanned assembly is mapped to a service. + + Registration limit type. + Registration style. + Activator data type. + Registration to set service mapping on. + Function mapping types to services. + Registration builder allowing the registration to be configured. + + + + Specifies how a type from a scanned assembly is mapped to a service. + + Registration limit type. + Registration style. + Activator data type. + Registration to set service mapping on. + Function mapping types to services. + Registration builder allowing the registration to be configured. + + + + Specifies how a type from a scanned assembly is mapped to a service. + + Registration limit type. + Registration style. + Activator data type. + Registration to set service mapping on. + Function mapping types to services. + Registration builder allowing the registration to be configured. + + + + Specifies how a type from a scanned assembly is mapped to a service. + + Registration limit type. + Registration style. + Activator data type. + Registration to set service mapping on. + Function mapping types to services. + Registration builder allowing the registration to be configured. + + + + Specifies that a type from a scanned assembly provides its own concrete type as a service. + + Registration limit type. + Registration to set service mapping on. + Registration builder allowing the registration to be configured. + + + + Specifies that a type provides its own concrete type as a service. + + Registration limit type. + Activator data type. + Registration to set service mapping on. + Registration builder allowing the registration to be configured. + + + + Specifies that a type provides its own concrete type as a service. + + Registration limit type. + Registration to set service mapping on. + Registration builder allowing the registration to be configured. + + + + Specify how a type from a scanned assembly provides metadata. + + Registration limit type. + Registration style. + Activator data type. + Registration to set metadata on. + A function mapping the type to a list of metadata items. + Registration builder allowing the registration to be configured. + + + + Use the properties of an attribute (or interface implemented by an attribute) on the scanned type + to provide metadata values. + + Inherited attributes are supported; however, there must be at most one matching attribute + in the inheritance chain. + The attribute applied to the scanned type. + Registration to set metadata on. + Registration builder allowing the registration to be configured. + + + + Specify how a type from a scanned assembly provides metadata. + + Registration limit type. + Registration style. + Activator data type. + Registration to set service mapping on. + Key of the metadata item. + A function retrieving the value of the item from the component type. + Registration builder allowing the registration to be configured. + + + + Specifies how a type from a scanned assembly is mapped to a named service. + + Registration to set service mapping on. + Service type provided by the component. + Function mapping types to service names. + Registration builder allowing the registration to be configured. + + + + Specifies how a type from a scanned assembly is mapped to a named service. + + Registration limit type. + Registration style. + Activator data type. + Registration to set service mapping on. + Service type provided by the component. + Function mapping types to service names. + Registration builder allowing the registration to be configured. + + + + Specifies how a type from a scanned assembly is mapped to a keyed service. + + Registration to set service mapping on. + Service type provided by the component. + Function mapping types to service keys. + Registration builder allowing the registration to be configured. + + + + Specifies how a type from a scanned assembly is mapped to a keyed service. + + Registration limit type. + Registration style. + Activator data type. + Registration to set service mapping on. + Service type provided by the component. + Function mapping types to service keys. + Registration builder allowing the registration to be configured. + + + + Specifies that a type from a scanned assembly is registered as providing all of its + implemented interfaces. + + Registration limit type. + Registration to set service mapping on. + Registration builder allowing the registration to be configured. + + + + Specifies that a type is registered as providing all of its implemented interfaces. + + Registration limit type. + Activator data type. + Registration to set service mapping on. + Registration builder allowing the registration to be configured. + + + + Specifies that a type is registered as providing all of its implemented interfaces. + + Registration limit type. + Registration to set service mapping on. + Registration builder allowing the registration to be configured. + + + + Set the policy used to find candidate constructors on the implementation type. + + Registration limit type. + Activator data type. + Registration style. + Registration to set policy on. + Policy to be used when searching for constructors. + A registration builder allowing further configuration of the component. + + + + Set the policy used to find candidate constructors on the implementation type. + + Registration limit type. + Activator data type. + Registration style. + Registration to set policy on. + A function that returns the constructors to select from. + A registration builder allowing further configuration of the component. + + + + Set the policy used to select from available constructors on the implementation type. + + Registration limit type. + Activator data type. + Registration style. + Registration to set policy on. + Constructor signature to match. + A registration builder allowing further configuration of the component. + + + + Set the policy used to select from available constructors on the implementation type. + + Registration limit type. + Registration style. + Activator data type. + Registration to set policy on. + Policy to be used when selecting a constructor. + A registration builder allowing further configuration of the component. + + + + Set the policy used to select from available constructors on the implementation type. + + Registration limit type. + Activator data type. + Registration style. + Registration to set policy on. + Expression demonstrating how the constructor is called. + A registration builder allowing further configuration of the component. + + + + Configure an explicit value for a constructor parameter. + + Registration limit type. + Registration style. + Activator data type. + Registration to set parameter on. + Name of a constructor parameter on the target type. + Value to supply to the parameter. + A registration builder allowing further configuration of the component. + + + + Configure an explicit value for a constructor parameter. + + Registration limit type. + Registration style. + Activator data type. + Registration to set parameter on. + The parameter to supply to the constructor. + A registration builder allowing further configuration of the component. + + + + Configure an explicit value for a constructor parameter. + + Registration limit type. + Registration style. + Activator data type. + Registration to set parameter on. + A predicate selecting the parameter to set. + + A registration builder allowing further configuration of the component. + + + + Configure explicit values for constructor parameters. + + Registration limit type. + Registration style. + Activator data type. + Registration to set parameter on. + The parameters to supply to the constructor. + A registration builder allowing further configuration of the component. + + + + Configure an explicit value for a property. + + Registration limit type. + Registration style. + Activator data type. + Registration to set property on. + Name of a property on the target type. + Value to supply to the property. + A registration builder allowing further configuration of the component. + + + + Configure an explicit value for a property. + + Registration limit type. + Registration style. + Activator data type. + Registration to set parameter on. + The property to supply. + A registration builder allowing further configuration of the component. + + + + Configure explicit values for properties. + + Registration limit type. + Registration style. + Activator data type. + Registration to set parameter on. + The properties to supply. + A registration builder allowing further configuration of the component. + + + + Sets the target of the registration (used for metadata generation.) + + The type of the limit. + The type of the activator data. + Registration style + Registration to set target for. + The target. + + Registration builder allowing the registration to be configured. + + + Thrown if or is . + + + + + Provide a handler to be called when the component is registered. + + Registration limit type. + Registration style. + Activator data type. + Registration add handler to. + The handler. + Registration builder allowing the registration to be configured. + + + + Provide a handler to be called when the component is registred. + + Registration limit type. + Registration style. + Registration add handler to. + The handler. + Registration builder allowing the registration to be configured. + + + + Specifies that a type from a scanned assembly is registered if it implements an interface + that closes the provided open generic interface type. + + Registration limit type. + Registration style. + Activator data type. + Registration to set service mapping on. + The open generic interface or base class type for which implementations will be found. + Registration builder allowing the registration to be configured. + + + + Filters the scanned types to include only those assignable to the provided + type. + + Registration limit type. + Registration style. + Activator data type. + Registration to filter types from. + The type or interface which all classes must be assignable from. + Registration builder allowing the registration to be configured. + + + + Filters the scanned types to include only those assignable to the provided + type. + + Registration to filter types from. + The type or interface which all classes must be assignable from. + Registration builder allowing the registration to be configured. + + + + Filters the scanned types to exclude the provided type. + + Registration to filter types from. + The concrete type to exclude. + Registration builder allowing the registration to be configured. + + + + Filters the scanned types to exclude the provided type, providing specific configuration for + the excluded type. + + Registration to filter types from. + Registration for the excepted type. + The concrete type to exclude. + Registration builder allowing the registration to be configured. + + + + Filters the scanned types to include only those in the namespace of the provided type + or one of its sub-namespaces. + + Registration to filter types from. + A type in the target namespace. + Registration builder allowing the registration to be configured. + + + + Filters the scanned types to include only those in the provided namespace + or one of its sub-namespaces. + + Registration limit type. + Registration style. + Activator data type. + Registration to filter types from. + The namespace from which types will be selected. + Registration builder allowing the registration to be configured. + + + + Adapt all components implementing service + to provide using the provided + function. + + Service type to adapt from. + Service type to adapt to. Must not be the + same as . + Container builder. + Function adapting to + service , given the context and parameters. + + + + Adapt all components implementing service + to provide using the provided + function. + + Service type to adapt from. + Service type to adapt to. Must not be the + same as . + Container builder. + Function adapting to + service , given the context. + + + + Adapt all components implementing service + to provide using the provided + function. + + Service type to adapt from. + Service type to adapt to. Must not be the + same as . + Container builder. + Function adapting to + service . + + + + Decorate all components implementing open generic service . + The and parameters must be different values. + + Container builder. + Service type being decorated. Must be an open generic type. + Service key or name associated with the components being decorated. + Service key or name given to the decorated components. + The type of the decorator. Must be an open generic type, and accept a parameter + of type , which will be set to the instance being decorated. + + + + Decorate all components implementing service + using the provided function. + The and parameters must be different values. + + Service type being decorated. + Container builder. + Function decorating a component instance that provides + , given the context and parameters. + Service key or name associated with the components being decorated. + Service key or name given to the decorated components. + + + + Decorate all components implementing service + using the provided function. + The and parameters must be different values. + + Service type being decorated. + Container builder. + Function decorating a component instance that provides + , given the context. + Service key or name associated with the components being decorated. + Service key or name given to the decorated components. + + + + Decorate all components implementing service + using the provided function. + The and parameters must be different values. + + Service type being decorated. + Container builder. + Function decorating a component instance that provides + . + Service key or name associated with the components being decorated. + Service key or name given to the decorated components. + + + + Run a supplied action instead of disposing instances when they're no + longer required. + + Registration limit type. + Activator data type. + Registration style. + Registration to set release action for. + An action to perform instead of disposing the instance. + Registration builder allowing the registration to be configured. + Only one release action can be configured per registration. + + + + Wraps a registration in an implicit and automatically + activates the registration after the container is built. + + Registration to set release action for. + Registration limit type. + Activator data type. + Registration style. + A registration builder allowing further configuration of the component. + + + While you can implement an to perform some logic at + container build time, sometimes you need to just activate a registered component and + that's it. This extension allows you to automatically activate a registration on + container build. No additional logic is executed and the resolved instance is not held + so container disposal will end up disposing of the instance. + + + Depending on how you register the lifetime of the component, you may get an exception + when you build the container - components that are scoped to specific lifetimes (like + ASP.NET components scoped to a request lifetime) will fail to resolve because the + appropriate lifetime is not available. + + + + + + Share one instance of the component within the context of a single + web/HTTP/API request. Only available for integration that supports + per-request dependencies (e.g., MVC, Web API, web forms, etc.). + + Registration limit type. + Registration style. + Activator data type. + The registration to configure. + Additional tags applied for matching lifetime scopes. + A registration builder allowing further configuration of the component. + + Thrown if is . + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The instance registration '{0}' can support SingleInstance() sharing only.. + + + + + Looks up a localized string similar to A metadata attribute of type {0} was not found on {1}.. + + + + + Looks up a localized string similar to More than one metadata attribute of type {0} was found on {1}.. + + + + + Looks up a localized string similar to No matching constructor exists on type '{0}'.. + + + + + An activator builder with no parameters. + + + + + Return the provided activator. + + The activator to return. + + + + Gets the activator. + + + + + Registration style for individual components. + + + + + The id used for the registration. + + + + + Handlers to notify of the component registration event. + + + + + By default, new registrations override existing registrations as defaults. + If set to true, new registrations will not change existing defaults. + + + + + The component upon which this registration is based. + + + + + Used to build an from component registrations. + + + + var builder = new ContainerBuilder(); + + builder.RegisterType<Logger>() + .As<ILogger>() + .SingleInstance(); + + builder.Register(c => new MessageHandler(c.Resolve<ILogger>())); + + var container = builder.Build(); + // resolve components from container... + + + Most functionality is accessed + via extension methods in . + + + + + + Register a callback that will be invoked when the container is configured. + + This is primarily for extending the builder syntax. + Callback to execute. + + + + Create a new container with the component registrations that have been made. + + Options that influence the way the container is initialised. + + Build can only be called once per + - this prevents ownership issues for provided instances. + Build enables support for the relationship types that come with Autofac (e.g. + Func, Owned, Meta, Lazy, IEnumerable.) To exclude support for these types, + first create the container, then call Update() on the builder. + + A new container with the configured component registrations. + + + + Configure an existing container with the component registrations + that have been made. + + + Update can only be called once per + - this prevents ownership issues for provided instances. + + An existing container to make the registrations in. + + + + Configure an existing container with the component registrations + that have been made and allows additional build options to be specified. + + + Update can only be called once per + - this prevents ownership issues for provided instances. + + An existing container to make the registrations in. + Options that influence the way the container is updated. + + + + Configure an existing registry with the component registrations + that have been made. + + + Update can only be called once per + - this prevents ownership issues for provided instances. + + An existing registry to make the registrations in. + + + + A parameter identified by name. When applied to a reflection-based + component, will be matched against + the name of the component's constructor arguments. When applied to + a delegate-based component, the parameter can be accessed using + . + + + Component with parameter: + + public class MyComponent + { + public MyComponent(int amount) { ... } + } + + Providing the parameter: + + var builder = new ContainerBuilder(); + builder.RegisterType<MyComponent>(); + var container = builder.Build(); + var myComponent = container.Resolve<MyComponent>(new NamedParameter("amount", 123)); + + + + + + Create a with the specified constant value. + + The name of the parameter. + The parameter value. + + + + The name of the parameter. + + + + + Extension methods that simplify extraction of parameter values from + an where T is . + Each method returns the first matching parameter value, or throws an exception if + none is provided. + + + At configuration time, delegate registrations can retrieve parameter values using + the methods , and : + + builder.Register((c, p) => new FtpClient(p.Named<string>("server"))); + + These parameters can be provided at resolution time: + + container.Resolve<FtpClient>(new NamedParameter("server", "ftp.example.com")); + + Alternatively, the parameters can be provided via a Generated Factory - http://code.google.com/p/autofac/wiki/DelegateFactories. + + + + + Retrieve a named parameter value from a instance. + + The type to which the returned value will be cast. + The available parameters to choose from. + The name of the parameter to select. + The value of the selected parameter. + + + + + Retrieve a positional parameter value from a instance. + + The type to which the returned value will be cast. + The available parameters to choose from. + The zero-based position of the parameter to select. + The value of the selected parameter. + The position value is the one associated with the parameter when + it was constructed, not its index into the + sequence. + + + + + Retrieve a typed parameter value from a instance. + + The type to which the returned value will be cast. + The available parameters to choose from. + The value of the selected parameter. + + + + + A parameter that is identified according to an integer representing its + position in an argument list. When applied to a reflection-based + component, will be matched against + the indices of the component's constructor arguments. When applied to + a delegate-based component, the parameter can be accessed using + . + + + Component with parameter: + + public class MyComponent + { + public MyComponent(int amount) { ... } + } + + Providing the parameter: + + var builder = new ContainerBuilder(); + builder.RegisterType<MyComponent>(); + var container = builder.Build(); + var myComponent = container.Resolve<MyComponent>(new PositionalParameter(0, 123)); + + + + + + Construct a positional parameter with the specified constant value. + + The zero-based position of the parameter. + The parameter value. + + + + The zero-based position of the parameter. + + + + + Adds syntactic convenience methods to the interface. + + + + + Set any properties on that can be + resolved in the context. + + Type of instance. Used only to provide method chaining. + The context from which to resolve the service. + The instance to inject properties into. + . + + + + Set any null-valued properties on that can be + resolved by the container. + + Type of instance. Used only to provide method chaining. + The context from which to resolve the service. + The instance to inject properties into. + . + + + + Retrieve a service from the context. + + The type to which the result will be cast. + The context from which to resolve the service. + Name of the service. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The type to which the result will be cast. + The context from which to resolve the service. + Name of the service. + The parameters. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The type to which the result will be cast. + The context from which to resolve the service. + Name of the service. + The parameters. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The type to which the result will be cast. + The context from which to resolve the service. + Key of the service. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The type to which the result will be cast. + The context from which to resolve the service. + Key of the service. + The parameters. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The type to which the result will be cast. + The context from which to resolve the service. + Key of the service. + The parameters. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The service to retrieve. + The context from which to resolve the service. + The component instance that provides the service. + + + + + + Retrieve a service from the context. + + The type to which the result will be cast. + The context from which to resolve the service. + Parameters for the service. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The type to which the result will be cast. + The context from which to resolve the service. + Parameters for the service. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The context from which to resolve the service. + The service type. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The context from which to resolve the service. + Parameters for the service. + The service type. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The context from which to resolve the service. + Parameters for the service. + The service type. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The context from which to resolve the service. + The service name. + Type of the service. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The context from which to resolve the service. + Parameters for the service. + The service name. + Type of the service. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The context from which to resolve the service. + Parameters for the service. + The service name. + Type of the service. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The context from which to resolve the service. + Key of the service. + Type of the service. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The context from which to resolve the service. + Key of the service. + Type of the service. + The parameters. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The context from which to resolve the service. + Key of the service. + Type of the service. + The parameters. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The context from which to resolve the service. + The service to resolve. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The context from which to resolve the service. + Parameters for the service. + The service to resolve. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context. + + The context from which to resolve the service. + Parameters for the service. + The service to resolve. + + The component instance that provides the service. + + + + + + + Retrieve a service from the context, or null if the service is not + registered. + + The context from which to resolve the service. + The service to resolve. + + The component instance that provides the service, or null. + + + + + + Retrieve a service from the context, or null if the service is not + registered. + + The context from which to resolve the service. + Parameters for the service. + The service to resolve. + + The component instance that provides the service, or null. + + + + + + Retrieve a service from the context, or null if the service is not + registered. + + The context from which to resolve the service. + Parameters for the service. + The service to resolve. + + The component instance that provides the service, or null. + + + + + + Retrieve a service from the context, or null if the service is not + registered. + + The context from which to resolve the service. + The name of the service. + The service to resolve. + + The component instance that provides the service, or null. + + + + + + Retrieve a service from the context, or null if the service is not + registered. + + The context from which to resolve the service. + Parameters for the service. + The name of the service. + The service to resolve. + + The component instance that provides the service, or null. + + + + + + Retrieve a service from the context, or null if the service is not + registered. + + The context from which to resolve the service. + Parameters for the service. + The name of the service. + The service to resolve. + + The component instance that provides the service, or null. + + + + + + Retrieve a service from the context, or null if the service is not + registered. + + The context from which to resolve the service. + The name of the service. + The service to resolve. + + The component instance that provides the service, or null. + + + + + + Retrieve a service from the context, or null if the service is not + registered. + + The context from which to resolve the service. + Parameters for the service. + The name of the service. + The service to resolve. + + The component instance that provides the service, or null. + + + + + + Retrieve a service from the context, or null if the service is not + registered. + + The context from which to resolve the service. + Parameters for the service. + The key of the service. + The service to resolve. + + The component instance that provides the service, or null. + + + + + + Retrieve a service from the context, or null if the service is not + registered. + + The context from which to resolve the service. + The type of the service. + + The component instance that provides the service, or null. + + + + + + Retrieve a service from the context, or null if the service is not + registered. + + The context from which to resolve the service. + Parameters for the service. + The type of the service. + + The component instance that provides the service, or null. + + + + + + Retrieve a service from the context, or null if the service is not + registered. + + The context from which to resolve the service. + Parameters for the service. + The type of the service. + + The component instance that provides the service, or null. + + + + + + Retrieve a service from the context, or null if the service is not + registered. + + The context from which to resolve the service. + The service. + + The component instance that provides the service, or null. + + + + + + Retrieve a service from the context, or null if the service is not + registered. + + The context from which to resolve the service. + The service. + Parameters for the service. + + The component instance that provides the service, or null. + + + + + + Retrieve a service from the context, or null if the service is not + registered. + + The context from which to resolve the service. + The service. + Parameters for the service. + + The component instance that provides the service, or null. + + + + + + Determine whether the specified service is available in the context. + + The context from which to resolve the service. + The service to test for the registration of. + True if the service is registered. + + + + Determine whether the specified service is available in the context. + + The context from which to resolve the service. + The service to test for the registration of. + True if the service is registered. + + + + Determine whether the specified service is available in the context. + + The context from which to resolve the service. + The name of the service to test for the registration of. + Type type of the service to test for the registration of. + True if the service is registered. + + + + Determine whether the specified service is available in the context. + + The context from which to resolve the service. + The name of the service to test for the registration of. + Type type of the service to test for the registration of. + True if the service is registered. + + + + Determine whether the specified service is available in the context. + + The context from which to resolve the service. + The key of the service to test for the registration of. + Type type of the service to test for the registration of. + True if the service is registered. + + + + Determine whether the specified service is available in the context. + + The context from which to resolve the service. + The key of the service to test for the registration of. + Type type of the service to test for the registration of. + True if the service is registered. + + + + Determine whether the specified service is available in the context. + + The context from which to resolve the service. + The service to test for the registration of. + True if the service is registered. + + + + Try to retrieve a service from the context. + + The context from which to resolve the service. + The service to resolve. + The resulting component instance providing the service, or null. + The parameters. + + True if a component providing the service is available. + + + + Thrown if is . + + + + + Try to retrieve a service from the context. + + The context from which to resolve the service. + The service to resolve. + The resulting component instance providing the service, or null. + + True if a component providing the service is available. + + + + + + Try to retrieve a service from the context. + + The context from which to resolve the service. + The service type to resolve. + The resulting component instance providing the service, or null. + + True if a component providing the service is available. + + + + + + Try to retrieve a service from the context. + + The service type to resolve. + The context from which to resolve the service. + The resulting component instance providing the service, or default(T). + + True if a component providing the service is available. + + + + + + Try to retrieve a service from the context. + + The context from which to resolve the service. + The name of the service to resolve. + The type of the service to resolve. + The resulting component instance providing the service, or null. + + True if a component providing the service is available. + + + + + + Try to retrieve a service from the context. + + The context from which to resolve the service. + The key of the service to resolve. + The type of the service to resolve. + The resulting component instance providing the service, or null. + + True if a component providing the service is available. + + + + + + Flexible parameter type allows arbitrary values to be retrieved + from the resolution context. + + + + + Create an instance of the ResolvedParameter class. + + A predicate that determines which parameters on a constructor will be supplied by this instance. + A function that supplies the parameter value given the context. + + + + Returns true if the parameter is able to provide a value to a particular site. + + Constructor, method, or property-mutator parameter. + The component context in which the value is being provided. + If the result is true, the valueProvider parameter will + be set to a function that will lazily retrieve the parameter value. If the result is false, + will be set to null. + True if a value can be supplied; otherwise, false. + + + + Construct a that will match parameters of type + and resolve for those parameters an implementation + registered with the name . + + The type of the parameter to match. + The name of the matching service to resolve. + A configured instance. + + + + + + Construct a that will match parameters of type + and resolve for those parameters an implementation + registered with the key . + + The type of the parameter to match. + The key of the matching service to resolve. + A configured instance. + + + + A parameter that can supply values to sites that exactly + match a specified type. When applied to a reflection-based + component, will be matched against + the types of the component's constructor arguments. When applied to + a delegate-based component, the parameter can be accessed using + . + + + Component with parameter: + + public class MyComponent + { + public MyComponent(int amount) { ... } + } + + Providing the parameter: + + var builder = new ContainerBuilder(); + builder.RegisterType<MyComponent>(); + var container = builder.Build(); + var myComponent = container.Resolve<MyComponent>(new TypedParameter(typeof(int), 123)); + + + + + + Create a typed parameter with the specified constant value. + + The exact type to match. + The parameter value. + + + + Shortcut for creating + by using the + + type to be used for the parameter + The parameter value. + new typed parameter + + + + The type against which targets are matched. + + + + + Extends with methods that are useful in + building scanning rules for . + + + + + Returns true if this type is in the namespace + or one of its sub-namespaces. + + The type to test. + The namespace to test. + True if this type is in the namespace + or one of its sub-namespaces; otherwise, false. + + + + Returns true if this type is in the same namespace as + or one of its sub-namespaces. + + The type to test. + True if this type is in the same namespace as + or one of its sub-namespaces; otherwise, false. + + + Determines whether the candidate type supports any base or + interface that closes the provided generic type. + + + + + + + Determines whether this type is assignable to . + + The type to test assignability to. + True if this type is assignable to references of type + ; otherwise, False. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The type '{0}' is not an open generic class or interface type.. + + + + + Extension methods for . + + + + + Safely returns the set of loadable types from an assembly. + + The from which to load types. + + The set of types from the , or the subset + of types that could be loaded if there was any error. + + + Thrown if is . + + + + + Helper methods used throughout the codebase. + + + + + Enforce that an argument is not null. Returns the + value if valid so that it can be used inline in + base initialiser syntax. + + + + + + + + + Enforce that sequence does not contain null. Returns the + value if valid so that it can be used inline in + base initialiser syntax. + + + The value. + The name. + + + + + Enforces that the provided object is non-null. + + + The value. + + + + + Enforce that an argument is not null or empty. Returns the + value if valid so that it can be used inline in + base initialiser syntax. + + The value. + The description. + + + + + Enforce that the argument is a delegate type. + + The type to test. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The argument '{0}' cannot be empty.. + + + + + Looks up a localized string similar to The object of type '{0}' cannot be null.. + + + + + Looks up a localized string similar to Type {0} returns void.. + + + + + Looks up a localized string similar to The sequence provided as argument '{0}' cannot contain null elements.. + + + + + Looks up a localized string similar to Type {0} is not a delegate type.. + + + + + Extension methods for reflection-related types. + + + + + Maps from a property-set-value parameter to the declaring property. + + Parameter to the property setter. + The property info on which the setter is specified. + True if the parameter is a property setter. + + + + Get a PropertyInfo object from an expression of the form + x => x.P. + + Type declaring the property. + The type of the property. + Expression mapping an instance of the + declaring type to the property value. + Property info. + + + + Get the MethodInfo for a method called in the + expression. + + Type on which the method is called. + Expression demonstrating how the method appears. + The method info for the called method. + + + + Gets the for the new operation called in the expression. + + The type on which the constructor is called. + Expression demonstrating how the constructor is called. + The for the called constructor. + + + + Retrieves a custom attribute of a specified type that is applied to a specified member, + and optionally inspects the ancestors of that member. + + The type of attribute to search for. + The member to inspect. + true to inspect the ancestors of element; otherwise, false. + A custom attribute that matches , or null if no such attribute is found. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The provided expression must be of the form () =>new X(), but the provided expression was {0}.. + + + + + Looks up a localized string similar to The provided expression must be of the form x =>x.M(), but the provided expression was {0}.. + + + + + Looks up a localized string similar to The provided expression must be of the form x =>x.P, but the provided expression was {0}.. + + + + + Adapts an action to the interface. + + + + + Joins the strings into one single string interspersing the elements with the separator (a-la + System.String.Join()). + + The elements. + The separator. + The joined string. + + + + Appends the item to the specified sequence. + + + The sequence. + The trailing item. + + + + + Prepends the item to the specified sequence. + + + The sequence. + The leading item. + + + + Returns the first concrete interface supported by the candidate type that + closes the provided open generic service type. + The type that is being checked for the interface. + The open generic type to locate. + The type of the interface. + + + + Looks for an interface on the candidate type that closes the provided open generic interface type. + + The type that is being checked for the interface. + The open generic service type to locate. + True if a closed implementation was found; otherwise false. + + + + Retrieve registrations for an unregistered service, to be used + by the container. + + The service that was requested. + A function that will return existing registrations for a service. + Registrations providing the service. + + + + Signal attribute for static analysis that indicates a helper method is + validating arguments for . + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Unable to generate a function to return type '{0}' with input parameter types [{1}]. The input parameter type list has duplicate types. Try registering a custom delegate type instead of using a generic Func relationship.. + + + + + Looks up a localized string similar to Delegate Support (Func<T>and Custom Delegates). + + + + diff --git a/Katteker.Test/testdata/Example.exe.config b/Katteker.Test/testdata/Example.exe.config new file mode 100644 index 0000000..d1428ad --- /dev/null +++ b/Katteker.Test/testdata/Example.exe.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/Katteker.Test/testdata/Example.vshost.exe b/Katteker.Test/testdata/Example.vshost.exe new file mode 100644 index 0000000000000000000000000000000000000000..7a9374d9dbae67f48d12341f60028c420cbdf0c3 GIT binary patch literal 35840 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 literal 0 HcmV?d00001 diff --git a/Katteker.Test/testdata/Katteker.UserInterface.dll.config b/Katteker.Test/testdata/Katteker.UserInterface.dll.config new file mode 100644 index 0000000..f2c1f9b --- /dev/null +++ b/Katteker.Test/testdata/Katteker.UserInterface.dll.config @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Katteker.Test/testdata/Katteker.UserInterface.xml b/Katteker.Test/testdata/Katteker.UserInterface.xml new file mode 100644 index 0000000..ad0270a --- /dev/null +++ b/Katteker.Test/testdata/Katteker.UserInterface.xml @@ -0,0 +1,155 @@ + + + + Katteker.UserInterface + + + + + Native methods. + + + + + Hit Test Caption + + + + + Posted when the user presses the left mouse button while the cursor is within the nonclient area of a window. + + + + + Release the capture + + + + + Send message + + + + + Set Process API aware + + + + + The wrapper to add Katteker-capability to older Programs. + + + + + Checks for Updates. + + Task + + + + Checks for Updates. + + Is this Method called on Startup of the Program. + Task + + + + Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + + + + + Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + + + + + Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + + + + + Sucht eine lokalisierte Zeichenfolge, die Could not update your application. ähnelt. + + + + + Sucht eine lokalisierte Zeichenfolge, die Installed new Version! Would you like to restart the Application? ähnelt. + + + + + Sucht eine lokalisierte Zeichenfolge, die New Version ähnelt. + + + + + Sucht eine lokalisierte Zeichenfolge, die No update available. ähnelt. + + + + + Sucht eine lokalisierte Zeichenfolge, die Can't find configuration File. Ask your local distributor. ähnelt. + + + + + Sucht eine lokalisierte Zeichenfolge, die Ask your local distributor. ähnelt. + + + + + Sucht eine lokalisierte Zeichenfolge, die Error with Configuration-File ähnelt. + + + + + Sucht eine lokalisierte Zeichenfolge, die Error with Update ähnelt. + + + + + Sucht eine lokalisierte Zeichenfolge, die Updater ähnelt. + + + + + Sucht eine lokalisierte Zeichenfolge, die You can update to Version: ähnelt. + + + + + Sucht eine lokalisierte Zeichenfolge, die You're up to date. ähnelt. + + + + + Shows the Update Window. + + + + + The Update Window + + + + + + Clean up any resources being used. + + true if managed resources should be disposed; otherwise, false. + + + + Required designer variable. + + + + + Required method for Designer support - do not modify + the contents of this method with the code editor. + + + + diff --git a/Katteker.Test/testdata/Katteker.dll b/Katteker.Test/testdata/Katteker.dll new file mode 100644 index 0000000000000000000000000000000000000000..f0e62f57bdba72b4ac502e73aacb5315dbb74014 GIT binary patch literal 67072 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 literal 0 HcmV?d00001 diff --git a/Katteker.Test/testdata/Microsoft.Practices.ServiceLocation.dll b/Katteker.Test/testdata/Microsoft.Practices.ServiceLocation.dll new file mode 100644 index 0000000000000000000000000000000000000000..95bbd51e3a3482858c15f779c1e2724612cbe2df GIT binary patch literal 18112 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 WkFIW^%O7#~x4&GSU#I^q68bMcgSfH) literal 0 HcmV?d00001 diff --git a/Katteker.Test/testdata/Microsoft.Practices.ServiceLocation.xml b/Katteker.Test/testdata/Microsoft.Practices.ServiceLocation.xml new file mode 100644 index 0000000..dbfa9ae --- /dev/null +++ b/Katteker.Test/testdata/Microsoft.Practices.ServiceLocation.xml @@ -0,0 +1,268 @@ + + + + Microsoft.Practices.ServiceLocation + + + + + The standard exception thrown when a ServiceLocator has an error in resolving an object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a specified error message. + + + The message that describes the error. + + + + + Initializes a new instance of the class with a specified error message and a reference to the inner exception that is the cause of this exception. + + + The error message that explains the reason for the exception. + + + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + + The generic Service Locator interface. This interface is used + to retrieve services (instances identified by type and optional + name) from a container. + + + + + Get an instance of the given . + + Type of object requested. + if there is an error resolving + the service instance. + The requested service instance. + + + + Get an instance of the given named . + + Type of object requested. + Name the object was registered with. + if there is an error resolving + the service instance. + The requested service instance. + + + + Get all instances of the given currently + registered in the container. + + Type of object requested. + if there is are errors resolving + the service instance. + A sequence of instances of the requested . + + + + Get an instance of the given . + + Type of object requested. + if there is are errors resolving + the service instance. + The requested service instance. + + + + Get an instance of the given named . + + Type of object requested. + Name the object was registered with. + if there is are errors resolving + the service instance. + The requested service instance. + + + + Get all instances of the given currently + registered in the container. + + Type of object requested. + if there is are errors resolving + the service instance. + A sequence of instances of the requested . + + + + This class provides the ambient container for this application. If your + framework defines such an ambient container, use ServiceLocator.Current + to get it. + + + + + Set the delegate that is used to retrieve the current container. + + Delegate that, when called, will return + the current ambient container. + + + + The current ambient container. + + + + + This class is a helper that provides a default implementation + for most of the methods of . + + + + + Implementation of . + + The requested service. + if there is an error in resolving the service instance. + The requested object. + + + + Get an instance of the given . + + Type of object requested. + if there is an error resolving + the service instance. + The requested service instance. + + + + Get an instance of the given named . + + Type of object requested. + Name the object was registered with. + if there is an error resolving + the service instance. + The requested service instance. + + + + Get all instances of the given currently + registered in the container. + + Type of object requested. + if there is are errors resolving + the service instance. + A sequence of instances of the requested . + + + + Get an instance of the given . + + Type of object requested. + if there is are errors resolving + the service instance. + The requested service instance. + + + + Get an instance of the given named . + + Type of object requested. + Name the object was registered with. + if there is are errors resolving + the service instance. + The requested service instance. + + + + Get all instances of the given currently + registered in the container. + + Type of object requested. + if there is are errors resolving + the service instance. + A sequence of instances of the requested . + + + + When implemented by inheriting classes, this method will do the actual work of resolving + the requested service instance. + + Type of instance requested. + Name of registered service you want. May be null. + The requested service instance. + + + + When implemented by inheriting classes, this method will do the actual work of + resolving all the requested service instances. + + Type of service requested. + Sequence of service instance objects. + + + + Format the exception message for use in an + that occurs while resolving a single service. + + The actual exception thrown by the implementation. + Type of service requested. + Name requested. + The formatted exception message string. + + + + Format the exception message for use in an + that occurs while resolving multiple service instances. + + The actual exception thrown by the implementation. + Type of service requested. + The formatted exception message string. + + + + This delegate type is used to provide a method that will + return the current container. Used with the + static accessor class. + + An . + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Activation error occurred while trying to get all instances of type {0}. + + + + + Looks up a localized string similar to Activation error occurred while trying to get instance of type {0}, key "{1}". + + + + + Looks up a localized string similar to ServiceLocationProvider must be set.. + + + + diff --git a/Katteker.Test/testdata/Prism.Autofac.Wpf.dll b/Katteker.Test/testdata/Prism.Autofac.Wpf.dll new file mode 100644 index 0000000000000000000000000000000000000000..be94ce5273d77c43e0ef43b9a23ee4ff92b97327 GIT binary patch literal 18432 zcmeHP3v?XSdH!d1wYy$PD`{m*e#$Ew+iN`**|H5bHnEoKtcnw5JE!I62LJ%kOT;XoRcS^5Vs8tBtXCa&dfff zl^xR4o}SZ=JpbJPasT_@|Ni$e_s+We!=EM>5xH@{|31+}c=EMgz%zp}umkh|K0psl zd#3gwY11>cJp-x{8q&3XJ(dc^W9hVJhI*BdKAaAz=}`NYXegy6lt^i*{~TNO)()ag zl8Y{Q`1wnm(q5$np<=1YGQwj~gO}kM!o43iQMpLVmfcLS#fa_#0{XIlBh+jEwJgg2 zvQHaj60UFVCECJ?{Y0N-M@+oNh)O`aeh<;yiM%u6AtGN6-v@kS4jwU;gC_8q7XpAM z91gp4uMn(?=!PB#QP{R032vxX+&R~J(GqGETpfnNa4jGRL#<6XN1BFawxJk2aGUU1uEtNLPh;V72sx6 zXf;_ywYhXJ5Wff6QSp2WP_&cXW6bB`Laf81`M|KP1jUh&!GY&IVbm6E)ReWtrTJQ6 zM<#~`OKcZ}Q9zcCsycL3E=yks`eM6iI3UYFm&!02av6)Vnvgk@LDt}3e|U-DqUQdF zUAEfB94Yn*?BJ>}sOMI4>^e6q$DVh{C@)ip21}gma7ul{OuGzNn-z*=Gb0upI!Z$9 z6j2AB$Xj7xNI*MT#uybqu0pqWd*1UbL)w5f{xC$)JXbRP6x=C=!Sd@ce5g9?Liu$U z$?ti}SbRB)Hv`n&Du>xcrx1FUe0T+;>+;aL*~Us17B;yueZgf{#|_A`CQL^l@Rg2QlqVbj1C<` z+6728dfb41H%82a|v|7T4ua7NgEy`dgF<*H*Zu zhua|0P^{O&dZQibE8H0xYHQOhyIf(!lE0y0D#Kg_?2$DwJQOw5c--MmWUu}tMg`Qu zbyV8`RNDx!xW2kDcd;F=q7~2x9M3vzN2pY|Ze%|+7V9k;Gqa{=t79ABaq(zbUtARK zLV=CN-Xgbl5mLqV6<)_A_fhR)CI#FLUaz)^4a+Nkja+RFzu|81>Q*^k*~}PhlL_6J z=hBL76Zu`?EnqjgT=gE0@K3RDU%gjD5Y#WO)8+6s2)Iy@Xr>|<=TSL#-4*V}Qu#_w zy27Fq3jwy>F0+WxMF~ExIE6Y}9nh%{Tnv?dzm>@&G?+VB3QbU7S0jgk`0M`mYJ{}A zu}1Gl`KRDo*$S?mU>dss#+WaJ>SkXJz8hJ`#B(Qynnyo@jDn$I72>b6slP5rt(6MN z_7|icFGzj4Ahkj+q<2?A>P-cyj~Aq3byc8ljRmP)1*r!LQg10peX<~RzPpeOYC-Ck z3sPSwNG&TWq<2R_>a_)_kL6Rbe&M;Jt~Gj5tHdJ=E)2*tvLezHX>Mv>hS8LJFOPet zFk&yfnrJNqK8vw&Vbs*sbict8&tc*5Dk5y*jwn5Vsho$-g&THsVSu71fUjjna8-J(8hL1sySdauQW3*L0-kb7rImCHvyO)<+yg!jJuBc>1sp75O09rv1PlxM zj-qj|hu(EfFZI*+y<=s5dc!?d<{?dRZxpc2{fD9etuFZ#B*$INr9t{y@hJ+@oBmT2 zpvK~Kd62x*-jF@?GkM$_q(L(MLHeYCgR<%O&|PKY-YOa?IS$zBIu1QM=|`y37hJa& zd+2Mh+(Yw<6~I@fMSZg=>3Y{Qn|=mZL$&hLMIQPW-?+DiepmK%Q4M{p{Asqw!{t6F zy;u~azY4HD?@4dS0qO`OFu~0#PXrdwtz~0n0a{y}2n6X_A@e{P+x!tws%VX$?YRk7 zd1wPH_fUekl#u^sZ-5>Ra9ytOxqShOm!!)Bln^k2`qt1dON_D_`W0Y+HlwTnZ4q#` zfK37}6Yysq=Kfs3LlUR26;SeXS_TZ#+X42{Ez{VBnI49(P2=`T_}PXd@T7-+2oHGZ z0{It##k5xb-82uKEE~XDgy=6AAX+3EN1QG%`5tYvFiiM22fjz6SY4EZQcj)VjRV8d z16Z>3tEHoeuIc20BuCaLVy6kI8sGIUiMC2NxN2!h$qlXwy3>0T;C$E3E)U&N@;TSm z5X9*^-#3cC2+2zXcF6a1@ePth34wi=UYs@qv3(bM3;GOQS0bV0(>8WOVD5z$Z*G8j zbrvT5+JDsLq7^pweg9tr`=*Ummz;39>2*8bQ>7C6^4fD)%ORTYdB9af4`i@MTwWSl zWby8mzT-k{TiDFsqx1m1E3k2N)l;qjl`Lk-Tj@3L4_sx`Ca~)ud4p6z`vvv{Ju1E8 z3euR3MN5C~nof@j>>8nS27O0hpYhEq{;g{UowhNr>r2uM`n`=+y50hhmT-BW@kOL} zT~$&r(Rwj6dZ0ycy%=^5J{bLDZ_u1GxqJ;0- z*l|(9k8SJ$q4QsDY`2&5`S1e4cD`K7SdEPh3f>AE`=KcPA{!eLrSG?~MFJbKvCRUz z(Z)XSW1UBB>>+_YWMjV*<(;&#i-pxcv$0a)vv+K4EWlc6BTmF9A%5!+M&SVXf#x)#un`QY~@<+NJB76H2i+$P{|0b>HH zfHUZTfa8F(>EnWaSisK-csC$Qk$zvYfMx+ov>Gss(c@FaD*&%4UITa#=`PUAsYP1p zX<@o&6X1tE+W|L4PdriQl zoRM#BTpdPpx^e)U?M=(Tv7HRIa4@3Vw^tiOme;++dyX6NlOEcvK>AkXN z=%>=x1sg5b%Qi2pDW)gjmwt?J}*6vu|}e$(z)no zAD6EY^qa~~NC%`J%MVKDh`i^}7o``ZXQ{XR7t#@#J;3(7A!PnTYJg0o+#qDewZ9i$ez#ucK^&>VLJVac$PLV$B1bB^rH_%ty>qS{D0(Q}H=#PtX zRgpeMx6|A1V{{Cb91}9%7VuSxEhL#OJeR&qqtan%p?s-`M3l`*{C!?04Mk4@wBQzZ=F6OvyMk`D=)yg9oSc3}{uXlbI42&Qq#wwq#FPEwTu;cyy`0X~_YYVr zF)d%;rzXigA@3H7^7HrMu7~ zk5P(FlZHEm(XNWBaffh+aWBKY26r3oO}Ka9z6^Ii?jb2f*GW<6xRmac#_6A=Yw%2o z^qtZX`lx(2Zc*Uc3*-CtwX4QZGB(0UIJj?LYb-tp zMV+dWOpvHD3fw%LOm5M44XCCP9g4*j%Q0Gdb8JNI7tXO=3V)>glS)_GFk>hLhO_?^ zJws^MHYjEWQysaM^r+)CuFYo6oK%yjHmo}(J56HKoKhT-ORU1pa6$DXp6q4+9ZVXB@=#C94c1v-7 zGOX|t={_hE3CG4xoZTpwYx-cv!MHNS!6DeDmM3M=SeYFi2n$`wh6vJZL)&oDM8u=S zY+6UGu%{fJC8z63+H^?y@!y3&XpI>P?NZYT?Q%n;cMK(Bra~PF6;a))gUmf6YBG^S zM@=fas51zO787sgy~AK-NNwnVS#rD5JIqb8SxfJLcM36CeKx~{aHn_)Ts^qBYM3r|cdSPZ)x=+(n zq9??XQ%X5Ql#rWTLc3zbbydVfmf16)q|l%Gv@FT;zfiJWNyZL}l#%5-7H`!tOvTN~ zj5cj(R9E{4a#(GfqGCi)W9b~KqlsCu^k`O--FXDvRD0E=YUXf9V##6d`(n__ALSyu zhWczuHpTrF<3=XdJCzuRwGpvZV017CSil}4?b0K*qnWcoF|F;P%#g!fsH?AAH4NsX z2DHF&TWz7jR(a-ET2qorc5KPWAiL({;MAsB;m>9v&#IqHP1ZM@CYF`iSwTJC>$yHLh!h)@Mex>M_iOakOdf;De4P!i2}G zc2!K3F@03b%NEO;J-8`5H9b4qWFmz}MMOzF%pYS^7CuclY5}ASAnieos=FUHpxp|S1Ww+@4Sb(HWo@=wz zt~5H6n%IJwTUeFlv@1hOI)SMivpqW6Fi#~}F1ICXvZoKY!kXgkMa5hADG-ZxOVW|CJh6{EEz60^JgR5FgQup-NEBeMGHByxPBT(7k-6{T@3aBo8I!-7Y5#=H#5VXLJbl%pi7 zm^>>tJg*0$S)HhXJ*RGxWjXVk(vCb;%8dT3T?Z+?UyHmTZ;qJvDgwa$XX0L821A~fgKLb z4%N)^(XqrCwCz=;K^c4VM6=^}MljQrGH-*9b&4)Vp)F#eXnDq|R>mT`VxmS?nA-E6 zWpJx9fHyZypOkwFDeFa51Y{;O?6(E7MoKifGaYT|{RrNAsmEGmQ(Me1c>u5%EbL-zNDg_?b$Hbi=I*(~-l&PXttdniS>OIdEONMKowfxV^*9yHV%1@wl z)W5B;mUeL23+#DQ)VLqH*v?jP2EZ8+xQ-grvcfvf(00v*bFgQfa#~;^`;omQO6e$^ zhdrzdYq*U!!Nxf9aVuhlBD~dadz-DF%G*03snF$iyeY_$uZioZLxMH`iS6^D51L~_ z%hXTIe+GZfnJ61Y8*wdg^1q}D^;U)5+;>#E!mdHCKD6S(spN8WHM3Xnt_R&Z`lI6! zj^ij|C2scz1F^%AlSI#?9h;HI#CNMBBG=`}#ny1UrfCD9nb*rZKpjRO;S!v7?4W}} zGe?6Jh19j#F5ztbB;TtAG+pqgYATSo*~y#hmrmHtF~~ivK%SLOo?QRuk8K5VbvS*4 zM;P{v6@{I`OYE)7MZ^ylDA5@a(Z=U;Z(-kCxqC#EIGVYCbi?j6ZmWf9wUd|WJf>Os zTF|mq+b7V%PJYKSF{;hq0cq~RPFao=mjX*DI`G!1FTd2k<(|u8B{MF%N^p#6e4KzJp#-+|= zJLb;B_b8Bh*-KJTtr+_`v&(%mf@8mygX-L3Fr9P}3#t|6k~|}ra-p09!QtTE8WM#a zDP|(9XKHDaM2uEarBo>k{{22b3V%B|_O2I+Sa4htgvWzpkBh`J!Lb)OFg`c80shM>#}j?WW`+Ti#ikysiWZxo4T!SR(`r`_HVK*jiKuEuU|fZ%SX$IvL; z2yy@nm`w1}EpiPGja-4?cvoQF+;X_buGe@sSBwQEQL7p$$fS}`PNi_>1pfq8GzvR4 zsFss(%UmIfW>WpE%|gpULbc_Nc|kScm4kcj!r(49!7d?gIkhY#R9WHyQN~2402$xGVKcs$0}|EeXCMHF_#V7s z&(2vZUj4Xl*<F8O<6c2s+e}-v{I!35m^8Dq>~i#{sTj5{}d;nAyS& zee3Q}XnE7JmH2Fq%OQLPz?TI%*Q!W!q>1oZ0nLtV?!c~{eE`v5Z=bHi$9F4XU|@QN zWgo8b5l4{ogfg5EWY(a_F4!M#Ip{>KcNi}}4 zGTNgJD(Q8-=baZ@8DF_-+3MyMO4IqP7fvqBIty~j#5)GJ2)>mU*VdMH{&)1Y?#~x3 z`OT5UOP$AdUn|}F_vgR-$WI=A>)B18x%P)EUflSjBY*tmYYR3!^Y)tfOxMYK->sQ> z+fc)kzTxIr`<=~Cbl0x=r=jH9AG~$^!jAi2+WLgM?b3gKXDl}UT;pJL~6Ax)^_}G8;j62htw`@0(VX&@RyMAt?oMp9|VAnGZwXfy{4!UxD9K6Twc*o(k(P&9@A&-O0x2dlo;0?1k3oUPFs5jq!USIo{jD))WU z@<#4EUVd|31Qm4?RZQ(+4dSyWif7mI9|wDJ7Zzh@e>J!Rq6?-H&1(ERh%L`u2xkjF z(+k2$Wb66wct`jx6mN7E+h=Q^d{<9ifb$Tx=1)~NIr}}xzTC;4>!UNjEWC(pE1Yao zH}&N5N->(XI~~bcm|H>j!Cn~>P!#!KZw>rIk@NrD7l*$==9)9VJNyPBQYd%(Ib_(M zVT9t?7!%)NM5F~d+jt>!KndBqijc8S1|m}3S!F`@aX>^`lq;LC&cs5xH~_%UM(rKI zh%_fxEG5o$@Z(Z(MjDak<}&TPF>9CHm{3CgMtF#iT~RSD9g&)Hm2kx}TX*)kOUTqh zIJa{u%r@DlCJrgr2MecWW-C84BQ&u}l^G73V(C8W)LEfHE$;K*!ANb3{L+?(@xPAD~Oh#&Q8+2c0; zaj&Lh738>y?Qq)DuASE!nv|XHfNPzCgd%LVAB=rwX3J@Z{&327x@h^y^}o6L%}0LPd+_?y z>yN#Vxc?iM{Bicm?N3+T{qVutANk8m&R=q)=c?^5pXl`;f9m}QKcOvn@E4(z^~yP` zx9?89ANl?(2X=@xxAPltjLfd8_OxqpaYSwG*`S&mhkN&k7m__uapJfK-*Z?5=ZiLeec7Y+ zeq;~6Qc>`M(PVC9DA9|O{`X$L+MBgaz6|M57SByNzw@?e`|w#pdotOLqa+gVEs7#O z$YAdKi=d-CH}C(a|F3v}f8!%wE64I{EZ*Dk%O09UXSt2IFWHaZv|$zDTx(tU4K;qH z6{UTE9oW%~QWtitHv{hi?6m&Z1$xx|=6k#s;KJ9yd^t~kU*rp~hW6%zKm}+Al%O?+ z9n(%Mw)y0T*V291ujT6;k*i1S&z77;+(bH zPeHGa-yk@i#Vd`le~VoPw;J2;L;z!!mp@27EdN=jl6)!}hvm8LmDPnea^dTI*@+&{ t_4oPMUXyU@XyA|Q(+g`yQTwU$SnUM2{Lfumt>3p!$2|N0*Z(~a{3pG%v>^Zh literal 0 HcmV?d00001 diff --git a/Katteker.Test/testdata/Prism.Autofac.Wpf.dll.config b/Katteker.Test/testdata/Prism.Autofac.Wpf.dll.config new file mode 100644 index 0000000..4fc378d --- /dev/null +++ b/Katteker.Test/testdata/Prism.Autofac.Wpf.dll.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Katteker.Test/testdata/Prism.Autofac.Wpf.xml b/Katteker.Test/testdata/Prism.Autofac.Wpf.xml new file mode 100644 index 0000000..d01d5c2 --- /dev/null +++ b/Katteker.Test/testdata/Prism.Autofac.Wpf.xml @@ -0,0 +1,266 @@ + + + + Prism.Autofac.Wpf + + + + + Base class that provides a basic bootstrapping sequence that + registers most of the Prism Library assets + in an Autofac . + + + This class must be overridden to provide application specific configuration. + + + + + Gets the default Autofac for the application. + + The default instance. + + + + Run the bootstrapper process. + + If , registers default Prism Library services in the container. This is the default behavior. + + + + Configures the LocatorProvider for the . + + + + + Configures the used by Prism. + + + + + Registers in the Autofac the of the Exceptions + that are not considered root exceptions by the . + + + + + Creates the that will be used to create the default container. + + A new instance of . + + + + Configures the . + May be overwritten in a derived class to add specific type mappings required by the application. + + + + + Creates the Autofac that will be used as the default container. + + A new instance of . + + + + Initializes the modules. May be overwritten in a derived class to use a custom Modules Catalog + + + + + Registers a type in the container only if that type was not already registered. + + The interface type to register. + The type implementing the interface. + The instance. + Registers the type as a singleton. + + + + Registers a type in the container only if that type was not already registered. + + The interface type to register. + The type implementing the interface. + Registers the type as a singleton. + + + + Registers an object instance in the container. + + Object instance. + The interface type to register. + Optional key for registration. + Registers the type as a singleton. + + + + Registers an object for navigation. + + The Type of the object to register + used to build + The unique name to register with the object + + + + Defines a adapter for the interface to be used by the Prism Library. + + + + + Initializes a new instance of . + + The that will be used + by the and methods. + + + + Resolves the instance of the requested service. + + Type of instance requested. + Name of registered service you want. May be null. + The requested service instance. + + + + Resolves all the instances of the requested service. + + Type of service requested. + Sequence of service instance objects. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Bootstrapper sequence completed.. + + + + + Looks up a localized string similar to Configuring the Autofac container.. + + + + + Looks up a localized string similar to Configuring the Autofac container builder.. + + + + + Looks up a localized string similar to Configuring default region behaviors.. + + + + + Looks up a localized string similar to Configuring module catalog.. + + + + + Looks up a localized string similar to Configuring region adapters.. + + + + + Looks up a localized string similar to Configuring ServiceLocator singleton.. + + + + + Looks up a localized string similar to Configuring the ViewModelLocator to use Autofac.. + + + + + Looks up a localized string similar to Creating Autofac container.. + + + + + Looks up a localized string similar to Creating Autofac container builder.. + + + + + Looks up a localized string similar to Creating module catalog.. + + + + + Looks up a localized string similar to Creating the shell.. + + + + + Looks up a localized string similar to Initializing modules.. + + + + + Looks up a localized string similar to Initializing the shell.. + + + + + Looks up a localized string similar to Logger was created successfully.. + + + + + Looks up a localized string similar to The method 'GetModuleEnumerator' of the bootstrapper must be overwritten in order to use the default module initialization logic.. + + + + + Looks up a localized string similar to The ContainerBuilder is required and cannot be null.. + + + + + Looks up a localized string similar to The IContainer is required and cannot be null.. + + + + + Looks up a localized string similar to The ILoggerFacade is required and cannot be null.. + + + + + Looks up a localized string similar to The IModuleCatalog is required and cannot be null in order to initialize the modules.. + + + + + Looks up a localized string similar to Registering Framework Exception Types.. + + + + + Looks up a localized string similar to Setting the RegionManager.. + + + + + Looks up a localized string similar to Type '{0}' was already registered by the application. Skipping.... + + + + + Looks up a localized string similar to Updating Regions.. + + + + diff --git a/Katteker.Test/testdata/Prism.Wpf.dll b/Katteker.Test/testdata/Prism.Wpf.dll new file mode 100644 index 0000000000000000000000000000000000000000..c6c7f4fedd58c3f7f64b4d85505d6a85f44f32c6 GIT binary patch literal 140288 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

hmW~U zl-Mhp3PIZ%$-sxOa)%(Z5R^=j45#F!y=zC%{Bmm0=JKEsKJ&Y2O z!V%#Yf?$I50zQ%nMyGb>!Ba@67Fk`n3=BhMN&iD!jHZsFpE+cto73JK22$A>iY=It z^=sn*k+IGab&>&@B%`HPsG+Tm5F9F(W~OwUogtd}(IPp?v4%ZbY_A?s?PS|8;z43W zt@-tXZ~7fMNM1UX+K0i&0aVPPEgZG@V0(U?V`!4u~{JtpFPhG>usMtwRAom!snbhErC|G8hY3oI6J}-{hD}PptefI|3k~iopRr5=fWi33jQa1yE+YAL)c%#-%FLSfwyR*sysAb}1=dw6Jaa>(Q_W{f#Y<`LQ`{&NtfWGVTV~3%w>pF= zGDAC43rdscr_8nh)^+RbccU!qGQrs+wz|ncl7pc85w^b%A1IoR@i2wE#M8QQ+p-rwSrd_Q)zH zD7`mVK9V29p!pMz4Yvy#`7Abutt;i52UhNbo^t%Nwb|7ZtOV(CXeZhXoV;8Sj@O2@ z0JU3Gzy!i~r_1GhRwirEh2c1!$KnP@a1UV~we(rJf>Er>OpM(eRu!dbe6$oKa2+>> zcELCydiR}Wj9qJrjX(tDOmx{bM7!P@`XXFPe#mH2yN4#ur0Bo2_hm0Kl~SwLP4$80 zK^r!cI)bmOQc^ABv|l6U&LqBdohsxH=dj-4dWF33O#rboW&Tik(wPb8PcWJ)C9G+3 zV~3@~qZUj>x>O96EWW%BL4jOQ^`{!x6qs5zP$(vIlLsLTnXxfSWp0)SGb^-a{AIDt z%J>R0?e(){2-ZptOvRI6OM6$c2tM4b3OZO^iH=BNO)`xom7Ckr-e!VFXEQq#Fer68 z(>YUR#xE&mzAQ&>CWiXl0LK~6nYTqczpmp0i^TP{s6nyYZLce#P1u5^X$`Oh@ zG>sUFS*%5TjY&C!MiSS;xb;js=JQh~y)M;_uFoHQab!XVeI zMJT2L!?lezKkc2*&lvku{NuBq``Xrv&i-!a zQ!9t`H6r2%k27@hg$Fb%HzfV@$J99|EH=O zFKN56m>FEL=I#%y`ERi|fA(h|dU@H`Z=dZvOoBMsiF4#I8p;%!2WjgH@?gFBby8k&f$-HzCmKRBn{7?hc$5!4-Z&*{_AG!7V#_-ck1M; zSjbx?rTA4J?paolA8d6hhR2!a07e_%HE2y zWt6sGF-MteaPE37{*%s4CJtC~Cj7yZfSSel{ZFu4 zO#?qq$VJmq<`E2@l(`!9_Zz%`ZY~FwFdprdEbvYOZy8^#b)3U_NuieqJ6H#I9$B;N z7sj|<+=wp$-O3-`|L1qec*kGR;&54P+6gbCu=N}b^K%2<+V>V6o=QOyqrDK6(S88Q a|91cMVcdecv*f`2zg;qaNZD({f&T+)+!G1_ literal 0 HcmV?d00001 diff --git a/Katteker.Test/testdata/Prism.Wpf.xml b/Katteker.Test/testdata/Prism.Wpf.xml new file mode 100644 index 0000000..33a2b41 --- /dev/null +++ b/Katteker.Test/testdata/Prism.Wpf.xml @@ -0,0 +1,5527 @@ + + + + Prism.Wpf + + + +

+ Base class that provides a basic bootstrapping sequence and hooks + that specific implementations can override + + + This class must be overridden to provide application specific configuration. + + + + + Gets the for the application. + + A instance. + + + + Gets the default for the application. + + The default instance. + + + + Gets the shell user interface + + The shell user interface. + + + + Create the used by the bootstrapper. + + + The base implementation returns a new TextLogger. + + + + + Runs the bootstrapper process. + + + + + Creates the used by Prism. + + + The base implementation returns a new ModuleCatalog. + + + + + Configures the used by Prism. + + + + + Configures the used by Prism. + + + + + Registers the s of the Exceptions that are not considered + root exceptions by the . + + + + + Initializes the modules. May be overwritten in a derived class to use a custom Modules Catalog + + + + + Configures the default region adapter mappings to use in the application, in order + to adapt UI controls defined in XAML to use a region and register it automatically. + May be overwritten in a derived class to add specific mappings required by the application. + + The instance containing all the mappings. + + + + Configures the . + This will be the list of default behaviors that will be added to a region. + + + + + Creates the shell or main window of the application. + + The shell of the application. + + If the returned instance is a , the + will attach the default of + the application in its attached property + in order to be able to add regions by using the + attached property from XAML. + + + + + Initializes the shell. + + + + + Run the bootstrapper process. + + If , registers default + Prism Library services in the container. This is the default behavior. + + + + Configures the LocatorProvider for the . + + + + + A dictionary of lists. + + The key to use for lists. + The type of the value held by lists. + + + + If a list does not already exist, it will be created automatically. + + The key of the list that will hold the value. + + + + Adds a value to a list with the given key. If a list does not already exist, + it will be created automatically. + + The key of the list that will hold the value. + The value to add to the list under the given key. + + + + Removes all entries in the dictionary. + + + + + Determines whether the dictionary contains the specified value. + + The value to locate. + true if the dictionary contains the value in any list; otherwise, false. + + + + Determines whether the dictionary contains the given key. + + The key to locate. + true if the dictionary contains the given key; otherwise, false. + + + + Retrieves the all the elements from the list which have a key that matches the condition + defined by the specified predicate. + + The filter with the condition to use to filter lists by their key. + The elements that have a key that matches the condition defined by the specified predicate. + + + + Retrieves all the elements that match the condition defined by the specified predicate. + + The filter with the condition to use to filter values. + The elements that match the condition defined by the specified predicate. + + + + Removes a list by key. + + The key of the list to remove. + if the element was removed. + + + + Removes a value from the list with the given key. + + The key of the list where the value exists. + The value to remove. + + + + Removes a value from all lists where it may be found. + + The value to remove. + + + + Gets a shallow copy of all values in all lists. + + List of values. + + + + Gets the list of keys in the dictionary. + + Collection of keys. + + + + Gets or sets the list associated with the given key. The + access always succeeds, eventually returning an empty list. + + The key of the list to access. + The list associated with the key. + + + + Gets the number of lists in the dictionary. + + Value indicating the values count. + + + + See for more information. + + + + + See for more information. + + + + + See for more information. + + + + + See for more information. + + + + + See for more information. + + + + + See for more information. + + + + + See for more information. + + + + + See for more information. + + + + + See for more information. + + + + + See for more information. + + + + + Class that wraps an object, so that other classes can notify for Change events. Typically, this class is set as + a Dependency Property on DependencyObjects, and allows other classes to observe any changes in the Value. + + + This class is required, because in Silverlight, it's not possible to receive Change notifications for Dependency properties that you do not own. + + The type of the property that's wrapped in the Observable object + + + + Identifies the Value property of the ObservableObject + + + + + Event that gets invoked when the Value property changes. + + + + + The value that's wrapped inside the ObservableObject. + + + + + Helper class for parsing instances. + + + + + Gets the query part of . + + The Uri. + + + + Gets the AbsolutePath part of . + + The Uri. + + + + Parses the query of into a dictionary. + + The URI. + + + + Base behavior to handle connecting a to a Command. + + The target object must derive from Control + + CommandBehaviorBase can be used to provide new behaviors for commands. + + + + + Constructor specifying the target object. + + The target object the behavior is attached to. + + + + Corresponding command to be execute and monitored for + + + + + The parameter to supply the command during execution + + + + + Object to which this behavior is attached. + + + + + Updates the target object's IsEnabled property based on the commands ability to execute. + + + + + Executes the command, if it's set, providing the + + + + + Interaction logic for ConfirmationChildWindow.xaml + + + DefaultConfirmationWindow + + + + + Creates a new instance of ConfirmationChildWindow. + + + + + Sets or gets the shown by this window./> + + + + + InitializeComponent + + + + + Interaction logic for NotificationChildWindow.xaml + + + DefaultNotificationWindow + + + + + Creates a new instance of + + + + + Sets or gets the shown by this window./> + + + + + InitializeComponent + + + + + Interaction logic for DefaultWindow.xaml + + + DefaultWindow + + + + + InitializeComponent + + + + + Basic implementation of . + + + + + Gets or sets a value indicating that the confirmation is confirmed. + + + + + Represents an interaction request used for confirmations. + + + + + Gets or sets a value indicating that the confirmation is confirmed. + + + + + Represents a request from user interaction. + + + View models can expose interaction request objects through properties and raise them when user interaction + is required so views associated with the view models can materialize the user interaction using an appropriate + mechanism. + + + + + Fired when the interaction is needed. + + + + + Interface used by the . + If the DataContext object of a view that is shown with this action implements this interface + it will be populated with the data of the interaction request + as well as an to finish the request upon invocation. + + + + + The passed when the interaction request was raised. + + + + + An that can be invoked to finish the interaction. + + + + + Represents an interaction request used for notifications. + + + + + Gets or sets the title to use for the notification. + + + + + Gets or sets the content of the notification. + + + + + Implementation of the interface. + + + + + Fired when interaction is needed. + + + + + Fires the Raised event. + + The context for the interaction request. + + + + Fires the Raised event. + + The context for the interaction request. + The callback to execute when the interaction is completed. + + + + Event args for the event. + + + + + Constructs a new instance of + + + + + + + Gets the context for a requested interaction. + + + + + Gets the callback to execute when an interaction is completed. + + + + + Custom event trigger for using with objects. + + + The standard class can be used instead, as long as the 'Raised' event + name is specified. + + + + + Specifies the name of the Event this EventTriggerBase is listening for. + + This implementation always returns the Raised event name for ease of connection with . + + + + Basic implementation of . + + + + + Gets or sets the title to use for the notification. + + + + + Gets or sets the content of the notification. + + + + + Trigger action that executes a command when invoked. + It also maintains the Enabled state of the target control based on the CanExecute method of the command. + + + + + Dependency property identifying if the associated element should automaticlaly be enabled or disabled based on the result of the Command's CanExecute + + + + + Gets or sets whther or not the associated element will automatically be enabled or disabled based on the result of the commands CanExecute + + + + + Dependency property identifying the command to execute when invoked. + + + + + Gets or sets the command to execute when invoked. + + + + + Dependency property identifying the command parameter to supply on command execution. + + + + + Gets or sets the command parameter to supply on command execution. + + + + + Dependency property identifying the TriggerParameterPath to be parsed to identify the child property of the trigger parameter to be used as the command parameter. + + + + + Gets or sets the TriggerParameterPath value. + + + + + Public wrapper of the Invoke method. + + + + + Executes the command + + This parameter is passed to the command; the CommandParameter specified in the CommandParameterProperty is used for command invocation if not null. + + + + Sets the Command and CommandParameter properties to null. + + + + + This method is called after the behavior is attached. + It updates the command behavior's Command and CommandParameter properties if necessary. + + + + + A CommandBehavior that exposes a public ExecuteCommand method. It provides the functionality to invoke commands and update Enabled state of the target control. + It is not possible to make the inherit from , since the + must already inherit from , so we chose to follow the aggregation approach. + + + + + Constructor specifying the target object. + + The target object the behavior is attached to. + + + + Executes the command, if it's set. + + + + + Shows a popup window in response to an being raised. + + + + + The content of the child window to display as part of the popup. + + + + + The type of content of the child window to display as part of the popup. + + + + + Determines if the content should be shown in a modal window or not. + + + + + Determines if the content should be initially shown centered over the view that raised the interaction request or not. + + + + + If set, applies this WindowStartupLocation to the child window. + + + + + If set, applies this Style to the child window. + + + + + Gets or sets the content of the window. + + + + + Gets or sets the type of content of the window. + + + + + Gets or sets if the window will be modal or not. + + + + + Gets or sets if the window will be initially shown centered over the view that raised the interaction request or not. + + + + + Gets or sets the startup location of the Window. + + + + + Gets or sets the Style of the Window. + + + + + Displays the child window and collects results for . + + The parameter to the action. If the action does not require a parameter, the parameter may be set to a null reference. + + + + Returns the window to display as part of the trigger action. + + The notification to be set as a DataContext in the window. + + + + + Checks if the WindowContent or its DataContext implements . + If so, it sets the corresponding values. + + The notification to be set as a DataContext in the HostWindow. + The HostWindow + + + + Creates a Window that is used when providing custom Window Content + + The Window + + + + When no WindowContent is sent this method is used to create a default basic window to show + the corresponding or . + + The INotification or IConfirmation parameter to show. + + + + + Implementation of that logs into a . + + + + + Initializes a new instance of that writes to + the console output. + + + + + Initializes a new instance of . + + The writer to use for writing log entries. + + + + Write a new log entry with the specified category and priority. + + Message body to log. + Category of the entry. + The priority of the entry. + + + + Disposes the associated . + + When , disposes the associated . + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + Calls . + 2 + + + + Implementation of that logs to .NET class. + + + + + Write a new log entry with the specified category and priority. + + Message body to log. + Category of the entry. + The priority of the entry. + + + + Handles AppDomain's AssemblyResolve event to be able to load assemblies dynamically in + the LoadFrom context, but be able to reference the type from assemblies loaded in the Load context. + + + + + Registers the specified assembly and resolves the types in it when the AppDomain requests for it. + + The path to the assemly to load in the LoadFrom context. + This method does not load the assembly immediately, but lazily until someone requests a + declared in the assembly. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + Calls . + 2 + + + + Disposes the associated . + + When , it is being called from the Dispose method. + + + + A catalog built from a configuration file. + + + + + Builds an instance of ConfigurationModuleCatalog with a as the default store. + + + + + Gets or sets the store where the configuration is kept. + + + + + Loads the catalog from the configuration. + + + + + Defines a store for the module metadata. + + + + + Gets the module configuration data. + + A instance. + + + + Represents the exception that is thrown when there is a circular dependency + between modules during the module loading process. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with the specified error message. + + The message that describes the error. + + + + Initializes a new instance of the class + with the specified error message and inner exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception. + + + + Initializes the exception with a particular module, error message and inner exception that happened. + + The name of the module. + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, + or a reference if no inner exception is specified. + + + + Initializes a new instance of the class + with the serialization data. + + Holds the serialized object data about the exception being thrown. + Contains contextual information about the source or destination. + + + + Represets a catalog created from a directory on disk. + + + The directory catalog will scan the contents of a directory, locating classes that implement + and add them to the catalog based on contents in their associated . + Assemblies are loaded into a new application domain with ReflectionOnlyLoad. The application domain is destroyed + once the assemblies have been discovered. + + The diretory catalog does not continue to monitor the directory after it has created the initialze catalog. + + + + + Directory containing modules to search for. + + + + + Drives the main logic of building the child domain and searching for the assemblies. + + + + + Creates a new child domain and copies the evidence from a parent domain. + + The parent domain. + The new child domain. + + Grabs the evidence and uses it to construct the new + because in a ClickOnce execution environment, creating an + will by default pick up the partial trust environment of + the AppLaunch.exe, which was the root executable. The AppLaunch.exe does a + create domain and applies the evidence from the ClickOnce manifests to + create the domain that the application is actually executing in. This will + need to be Full Trust for Prism applications. + + An is thrown if is null. + + + + Exception thrown when a module is declared twice in the same catalog. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The exception message. + + + + Initializes a new instance of the class. + + The exception message. + The inner exception. + + + + Initializes a new instance of the class with a specified error message. + + The name of the module. + The message that describes the error. + + + + Initializes a new instance of the class with a specified error message and a reference to the inner exception that is the cause of this exception. + + The name of the module. + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class + with the serialization data. + + Holds the serialized object data about the exception being thrown. + Contains contextual information about the source or destination. + + + + Loads modules from an arbitrary location on the filesystem. This typeloader is only called if + classes have a Ref parameter that starts with "file://". + This class is only used on the Desktop version of the Prism Library. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The assembly resolver. + + + + Raised repeatedly to provide progress as modules are loaded in the background. + + + + + Raised when a module is loaded or fails to load. + + + + + Evaluates the property to see if the current typeloader will be able to retrieve the . + Returns true if the property starts with "file://", because this indicates that the file + is a local file. + + Module that should have it's type loaded. + + if the current typeloader is able to retrieve the module, otherwise . + + An is thrown if is null. + + + + Retrieves the . + + Module that should have it's type loaded. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + Calls . + 2 + + + + Disposes the associated . + + When , it is being called from the Dispose method. + + + + Interface for classes that are responsible for resolving and loading assembly files. + + + + + Load an assembly when it's required by the application. + + + + + + Defines a store for the module metadata. + + + + + Gets the module configuration data. + + A instance. + + + + Defines the contract for the modules deployed in the application. + + + + + Notifies the module that it has be initialized. + + + + + This is the expected catalog definition for the ModuleManager. + The ModuleCatalog holds information about the modules that can be used by the + application. Each module is described in a ModuleInfo class, that records the + name, type and location of the module. + + + + + Gets all the classes that are in the . + + + + + Return the list of s that depends on. + + The to get the + An enumeration of that depends on. + + + + Returns the collection of s that contain both the s in + , but also all the modules they depend on. + + The modules to get the dependencies for. + + A collection of that contains both all s in + and also all the they depend on. + + + + + Initializes the catalog, which may load and validate the modules. + + + + + Adds a to the . + + The to add. + The for easily adding multiple modules. + + + + Marker interface that allows both s and s to be + added to the from code and XAML. + + + + + Declares a service which initializes the modules into the application. + + + + + Initializes the specified module. + + The module to initialize + + + + Defines the interface for the service that will retrieve and initialize the application's modules. + + + + + Initializes the modules marked as on the . + + + + + Loads and initializes the module on the with the name . + + Name of the module requested for initialization. + + + + Raised repeatedly to provide progress as modules are downloaded. + + + + + Raised when a module is loaded or fails to load. + + + + + Defines the interface for moduleTypeLoaders + + + + + Evaluates the property to see if the current typeloader will be able to retrieve the . + + Module that should have it's type loaded. + if the current typeloader is able to retrieve the module, otherwise . + + + + Retrieves the . + + Module that should have it's type loaded. + + + + Raised repeatedly to provide progress as modules are downloaded in the background. + + + + + Raised when a module is loaded or fails to load. + + + This event is raised once per ModuleInfo instance requested in . + + + + + Specifies on which stage the Module group will be initialized. + + + + + The module will be initialized when it is available on application start-up. + + + + + The module will be initialized when requested, and not automatically on application start-up. + + + + + Provides completion information after a module is loaded, or fails to load. + + + + + Initializes a new instance of the class. + + The module info. + Any error that occurred during the call. + + + + Gets the module info. + + The module info. + + + + Gets any error that occurred + + The exception if an error occurred; otherwise null. + + + + Gets or sets a value indicating whether the error has been handled by the event subscriber. + + trueif the error is handled; otherwise, false. + + If there is an error on this event and no event subscriber sets this to true, an exception will be thrown by the event publisher. + + + + + Base class for exceptions that are thrown because of a problem with modules. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The exception message. + + + + Initializes a new instance of the class. + + The exception message. + The inner exception. + + + + Initializes the exception with a particular module and error message. + + The name of the module. + The error message that explains the reason for the exception. + + + + Initializes the exception with a particular module, error message and inner exception that happened. + + The name of the module. + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, + or a reference if no inner exception is specified. + + + + Gets or sets the name of the module that this exception refers to. + + The name of the module. + + + + Initializes a new instance with serialized data. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + + Sets the with information about the exception. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + + Indicates that the class should be considered a named module using the + provided module name. + + + + + Gets or sets the name of the module. + + The name of the module. + + + + Gets or sets the value indicating whether the module should be loaded OnDemand. + + When (default value), it indicates the module should be loaded as soon as it's dependencies are satisfied. + Otherwise you should explicitily load this module via the . + + + + The holds information about the modules that can be used by the + application. Each module is described in a class, that records the + name, type and location of the module. + + It also verifies that the is internally valid. That means that + it does not have: + + Circular dependencies + Missing dependencies + + Invalid dependencies, such as a Module that's loaded at startup that depends on a module + that might need to be retrieved. + + + The also serves as a baseclass for more specialized Catalogs . + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class while providing an + initial list of s. + + The initial list of modules. + + + + Gets the items in the . This property is mainly used to add s or + s through XAML. + + The items in the catalog. + + + + Gets all the classes that are in the , regardless + if they are within a or not. + + The modules. + + + + Gets the s that have been added to the . + + The groups. + + + + Gets or sets a value that remembers whether the has been validated already. + + + + + Returns the list of s that are not contained within any . + + The groupless modules. + + + + Creates a from XAML. + + that contains the XAML declaration of the catalog. + An instance of built from the XAML. + + + + Creates a from a XAML included as an Application Resource. + + Relative that identifies the XAML included as an Application Resource. + An instance of build from the XAML. + + + + Loads the catalog if necessary. + + + + + Return the list of s that depends on. + + + If the was not yet validated, this method will call . + + The to get the + An enumeration of that depends on. + + + + Returns a list of s that contain both the s in + , but also all the modules they depend on. + + The modules to get the dependencies for. + + A list of that contains both all s in + but also all the they depend on. + + + + + Validates the . + + When validation of the fails. + + + + Adds a to the . + + The to add. + The for easily adding multiple modules. + + + + Adds a groupless to the catalog. + + of the module to be added. + Collection of module names () of the modules on which the module to be added logically depends on. + The same instance with the added module. + + + + Adds a groupless to the catalog. + + of the module to be added. + Stage on which the module to be added will be initialized. + Collection of module names () of the modules on which the module to be added logically depends on. + The same instance with the added module. + + + + Adds a groupless to the catalog. + + Name of the module to be added. + of the module to be added. + Collection of module names () of the modules on which the module to be added logically depends on. + The same instance with the added module. + + + + Adds a groupless to the catalog. + + Name of the module to be added. + of the module to be added. + Stage on which the module to be added will be initialized. + Collection of module names () of the modules on which the module to be added logically depends on. + The same instance with the added module. + + + + Adds a groupless to the catalog. + + Name of the module to be added. + of the module to be added. + Reference to the location of the module to be added assembly. + Stage on which the module to be added will be initialized. + Collection of module names () of the modules on which the module to be added logically depends on. + The same instance with the added module. + + + + Initializes the catalog, which may load and validate the modules. + + When validation of the fails, because this method calls . + + + + Creates and adds a to the catalog. + + Stage on which the module group to be added will be initialized. + Reference to the location of the module group to be added. + Collection of included in the group. + with the added module group. + + + + Checks for cyclic dependencies, by calling the dependencysolver. + + the. + + + + + Ensures that all the dependencies within refer to s + within that list. + + The modules to validate modules for. + + Throws if a in depends on a module that's + not in . + + Throws if is . + + + + Does the actual work of loading the catalog. The base implementation does nothing. + + + + + Sorts a list of s. This method is called by + to return a sorted list. + + The s to sort. + Sorted list of s + + + + Makes sure all modules have an Unique name. + + + Thrown if the names of one or more modules are not unique. + + + + + Ensures that there are no cyclic dependencies. + + + + + Ensures that there are no dependencies between modules on different groups. + + + A groupless module can only depend on other groupless modules. + A module within a group can depend on other modules within the same group and/or on groupless modules. + + + + + Ensures that there are no modules marked to be loaded + depending on modules loaded + + + + + Returns the on which the received module dependens on. + + Module whose dependant modules are requested. + Collection of dependants of . + + + + Ensures that the catalog is validated. + + + + + A configuration element to declare module metadata. + + + + + Initializes a new instance of . + + + + + Initializes a new instance of . + + The assembly file where the module is located. + The type of the module. + The name of the module. + This attribute specifies whether the module is loaded at startup. + + + + Gets or sets the assembly file. + + The assembly file. + + + + Gets or sets the module type. + + The module's type. + + + + Gets or sets the module name. + + The module's name. + + + + Gets or sets a value indicating whether the module should be loaded at startup. + + A value indicating whether the module should be loaded at startup. + + + + Gets or sets the modules this module depends on. + + The names of the modules that this depends on. + + + + A collection of . + + + + + Initializes a new instance of . + + + + + Initializes a new . + + The initial set of . + An is thrown if is . + + + + Gets a value indicating whether an exception should be raised if a duplicate element is found. + This property will always return true. + + A value. + + + + Gets the type of the . + + + The of this collection. + + + + + Gets the name used to identify this collection of elements in the configuration file when overridden in a derived class. + + + The name of the collection; otherwise, an empty string. + + + + + Gets the located at the specified index in the collection. + + The index of the element in the collection. + A . + + + + Adds a to the collection. + + A instance. + + + + Tests if the collection contains the configuration for the specified module name. + + The name of the module to search the configuration for. + if a configuration for the module is present; otherwise . + + + + Searches the collection for all the that match the specified predicate. + + A that implements the match test. + A with the successful matches. + An is thrown if is null. + + + + Creates a new . + + A . + + + + Gets the element key for a specified configuration element when overridden in a derived class. + + The to return the key for. + + An that acts as the key for the specified . + + + + + Specifies that the current module has a dependency on another module. This attribute should be used on classes that implement . + + + + + Initializes a new instance of . + + The name of the module that this module is dependant upon. + + + + Gets the name of the module that this module is dependant upon. + + The name of the module that this module is dependant upon. + + + + A collection of . + + + + + Initializes a new instance of . + + + + + Initializes a new instance of . + + An array of with initial list of dependencies. + + + + Gets the type of the . + + + The of this collection. + + + + + Gets the name used to identify this collection of elements in the configuration file when overridden in a derived class. + + + The name of the collection; otherwise, an empty string. + + + + + Gets the located at the specified index in the collection. + + The index of the element in the collection. + A . + + + + Creates a new . + + A . + + + + Gets the element key for a specified configuration element when overridden in a derived class. + + The to return the key for. + + An that acts as the key for the specified . + + + + + A for module dependencies. + + + + + Initializes a new instance of . + + + + + Initializes a new instance of . + + A module name. + + + + Gets or sets the name of a module antoher module depends on. + + The name of a module antoher module depends on. + + + + Used by to get the load sequence + for the modules to load according to their dependencies. + + + + + Adds a module to the solver. + + The name that uniquely identifies the module. + + + + Adds a module dependency between the modules specified by dependingModule and + dependentModule. + + The name of the module with the dependency. + The name of the module dependingModule + depends on. + + + + Calculates an ordered vector according to the defined dependencies. + Non-dependant modules appears at the beginning of the resulting array. + + The resulting ordered list of modules. + This exception is thrown + when a cycle is found in the defined depedency graph. + + + + Gets the number of modules added to the solver. + + The number of modules. + + + + Provides progress information as a module downloads. + + + + + Initializes a new instance of the class. + + The module info. + The bytes received. + The total bytes to receive. + + + + Getsthe module info. + + The module info. + + + + Gets the bytes received. + + The bytes received. + + + + Gets the total bytes to receive. + + The total bytes to receive. + + + + Defines the metadata that describes a module. + + + + + Initializes a new empty instance of . + + + + + Initializes a new instance of . + + The module's name. + The module 's AssemblyQualifiedName. + The modules this instance depends on. + An is thrown if is . + + + + Initializes a new instance of . + + The module's name. + The module's type. + + + + Gets or sets the name of the module. + + The name of the module. + + + + Gets or sets the module 's AssemblyQualifiedName. + + The type of the module. + + + + Gets or sets the list of modules that this module depends upon. + + The list of modules that this module depends upon. + + + + Specifies on which stage the Module will be initialized. + + + + + Reference to the location of the module assembly. + The following are examples of valid values: + file://c:/MyProject/Modules/MyModule.dll for a loose DLL in WPF. + + + + + + Gets or sets the state of the with regards to the module loading and initialization process. + + + + + Represents a group of instances that are usually deployed together. s + are also used by the to prevent common deployment problems such as having a module that's required + at startup that depends on modules that will only be downloaded on demand. + + The group also forwards and values to the s that it + contains. + + + + + Gets or sets the for the whole group. Any classes that are + added after setting this value will also get this . + + + The initialization mode. + + + + Gets or sets the value for the whole group. Any classes that are + added after setting this value will also get this . + + The ref value will also be used by the to determine which to use. + For example, using an "file://" prefix with a valid URL will cause the FileModuleTypeLoader to be used + (Only available in the desktop version of CAL). + + + The ref value that will be used. + + + + Adds an moduleInfo to the . + + The to the . + + + + Forwards and properties from this + to . + + The module info to forward values to. + An is thrown if is . + + + + Removes all s from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an , starting at a particular index. + + The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. + The zero-based index in at which copying begins. + + is null. + + + is less than 0. + + + is multidimensional. + -or- + is equal to or greater than the length of . + -or- + The number of elements in the source is greater than the available space from to the end of the destination . + + + + + Gets the number of elements contained in the . + + + + The number of elements contained in the . + + + + + Gets a value indicating whether the is read-only. + + + false, because the is not Read-Only. + + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Adds an item to the . + + + The to add to the . + Must be of type + + + The position into which the new element was inserted. + + + + + Determines whether the contains a specific value. + + + The to locate in the . + Must be of type + + + true if the is found in the ; otherwise, false. + + + + + Determines the index of a specific item in the . + + + The to locate in the . + Must be of type + + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + + The to insert into the . + Must be of type + + + is not a valid index in the . + + + If is null. + + + If is not of type + + + + + Gets a value indicating whether the has a fixed size. + + false, because the does not have a fixed length. + + + + + Removes the first occurrence of a specific object from the . + + + The to remove from the . + Must be of type + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + The is read-only. + + + + + Gets or sets the at the specified index. + + + + + + Copies the elements of the to an , starting at a particular index. + + The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. + The zero-based index in at which copying begins. + + is null. + + + is less than zero. + + + is multidimensional. + -or- + is equal to or greater than the length of . + -or- + The number of elements in the source is greater than the available space from to the end of the destination . + + + The type of the source cannot be cast automatically to the type of the destination . + + + + + Gets a value indicating whether access to the is synchronized (thread safe). + + + true if access to the is synchronized (thread safe); otherwise, false. + + + + + Gets an object that can be used to synchronize access to the . + + + + An object that can be used to synchronize access to the . + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Gets or sets the at the specified index. + + The at the specified index + + + + Defines extension methods for the class. + + + + + Adds a new module that is statically referenced to the specified module info group. + + The group where to add the module info in. + The name for the module. + The type for the module. This type should be a descendant of . + The names for the modules that this module depends on. + Returns the instance of the passed in module info group, to provide a fluid interface. + + + + Adds a new module that is statically referenced to the specified module info group. + + The group where to add the module info in. + The type for the module. This type should be a descendant of . + The names for the modules that this module depends on. + Returns the instance of the passed in module info group, to provide a fluid interface. + The name of the module will be the type name. + + + + Exception thrown by implementations whenever + a module fails to load. + + + + + Initializes a new instance. + + + + + Initializes a new instance of the class. + + The exception message. + + + + Initializes a new instance of the class. + + The exception message. + The inner exception. + + + + Initializes the exception with a particular module and error message. + + The name of the module. + The assembly where the module is located. + The error message that explains the reason for the exception. + + + + Initializes the exception with a particular module, error message and inner exception + that happened. + + The name of the module. + The assembly where the module is located. + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, + or a reference if no inner exception is specified. + + + + Initializes the exception with a particular module, error message and inner exception that happened. + + The name of the module. + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, + or a reference if no inner exception is specified. + + + + Initializes a new instance with serialized data. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + + Implements the interface. Handles loading of a module based on a type. + + + + + Initializes a new instance of . + + The container that will be used to resolve the modules by specifying its type. + The logger to use. + + + + Initializes the specified module. + + The module to initialize + + + + Handles any exception occurred in the module Initialization process, + logs the error using the and throws a . + This method can be overridden to provide a different behavior. + + The module metadata where the error happenened. + The assembly name. + The exception thrown that is the cause of the current error. + + + + + Uses the container to resolve a new by specifying its . + + The module to create. + A new instance of the module specified by . + + + + Uses the container to resolve a new by specifying its . + + The type name to resolve. This type must implement . + A new instance of . + + + + Component responsible for coordinating the modules' type loading and module initialization process. + + + Component responsible for coordinating the modules' type loading and module initialization process. + + + + + Initializes an instance of the class. + + Service used for initialization of modules. + Catalog that enumerates the modules to be loaded and initialized. + Logger used during the load and initialization of modules. + + + + The module catalog specified in the constructor. + + + + + Raised repeatedly to provide progress as modules are loaded in the background. + + + + + Raised when a module is loaded or fails to load. + + + + + Initializes the modules marked as on the . + + + + + Loads and initializes the module on the with the name . + + Name of the module requested for initialization. + + + + Checks if the module needs to be retrieved before it's initialized. + + Module that is being checked if needs retrieval. + + + + + Loads the modules that are not intialized and have their dependencies loaded. + + + + + Handles any exception occurred in the module typeloading process, + logs the error using the and throws a . + This method can be overridden to provide a different behavior. + + The module metadata where the error happenened. + The exception thrown that is the cause of the current error. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + Calls . + 2 + + + + Disposes the associated s. + + When , it is being called from the Dispose method. + + + + Returns the list of registered instances that will be + used to load the types of modules. + + The module type loaders. + + + + Exception thrown when a requested was not found. + + + Exception thrown when a requested is not found. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a specified error message. + + + The message that describes the error. + + + + + Initializes a new instance of the class with a specified error message. + + + The message that describes the error. + + The inner exception + + + + Initializes a new instance of the class with a specified error message and a reference to the inner exception that is the cause of this exception. + + The name of the module. + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class with a specified error message and a reference to the inner exception that is the cause of this exception. + + The name of the module. + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference if no inner exception is specified. + + + + Initializes a new instance of the class + with the serialization data. + + Holds the serialized object data about the exception being thrown. + Contains contextual information about the source or destination. + + + + A for module configuration. + + + + + Gets or sets the collection of modules configuration. + + A of . + + + + Defines the states a can be in, with regards to the module loading and initialization process. + + + + + Initial state for s. The is defined, + but it has not been loaded, retrieved or initialized yet. + + + + + The assembly that contains the type of the module is currently being loaded by an instance of a + . + + + + + The assembly that holds the Module is present. This means the type of the can be instantiated and initialized. + + + + + The module is currently Initializing, by the + + + + + The module is initialized and ready to be used. + + + + + Exception that's thrown when there is no registered in + that can handle this particular type of module. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a specified error message. + + + The message that describes the error. + + + + + Initializes a new instance of the class with a specified error message. + + + The message that describes the error. + + The inner exception + + + + Initializes the exception with a particular module, error message and inner exception that happened. + + The name of the module. + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, + or a reference if no inner exception is specified. + + + + Initializes a new instance with serialized data. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + + Exception thrown by implementations whenever + a module fails to retrieve. + + + + + Initializes a new instance. + + + + + Initializes a new instance with a specified error message. + + The message that describes the error. + + + + Initializes a new instance with a specified error message + and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, + or a reference if no inner exception is specified. + + + + Initializes the exception with a particular module and error message. + + The name of the module. + The error message that explains the reason for the exception. + + + + Initializes the exception with a particular module, error message and inner exception that happened. + + The name of the module. + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, + or a reference if no inner exception is specified. + + + + Initializes a new instance with serialized data. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + + This class defines the attached property and related change handler that calls the ViewModelLocator in Prism.Mvvm. + + + + + The AutoWireViewModel attached property. + + + + + Sets the DataContext of a View + + The View to set the DataContext on + The object to use as the DataContext for the View + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to The object must be of type '{0}' in order to use the current region adapter.. + + + + + Looks up a localized string similar to Cannot change the region name once is set. The current region name is '{0}'.. + + + + + Looks up a localized string similar to Cannot create navigation target '{0}'.. + + + + + Looks up a localized string similar to Type '{0}' does not implement from IRegionBehavior.. + + + + + Looks up a localized string similar to The ConfigurationStore cannot contain a null value. . + + + + + Looks up a localized string similar to ContentControl's Content property is not empty. + This control is being associated with a region, but the control is already bound to something else. + If you did not explicitly set the control's Content property, + this exception may be caused by a change in the value of the inherited RegionManager attached property.. + + + + + Looks up a localized string similar to At least one cyclic dependency has been found in the module catalog. Cycles in the module dependencies must be avoided.. + + + + + Looks up a localized string similar to Deactivation is not possible in this type of region.. + + + + + Looks up a localized string similar to {1}: {2}. Priority: {3}. Timestamp:{0:u}.. + + + + + Looks up a localized string similar to Neither the executeMethod nor the canExecuteMethod delegates can be null.. + + + + + Looks up a localized string similar to T for DelegateCommand<T> is not an object nor Nullable.. + + + + + Looks up a localized string similar to Cannot add dependency for unknown module {0}. + + + + + Looks up a localized string similar to A module declared a dependency on another module which is not declared to be loaded. Missing module(s): {0}. + + + + + Looks up a localized string similar to Directory {0} was not found.. + + + + + Looks up a localized string similar to A duplicated module with name {0} has been found by the loader.. + + + + + Looks up a localized string similar to A duplicated module group with name {0} has been found by the loader.. + + + + + Looks up a localized string similar to Unable to retrieve the module type {0} from the loaded assemblies. You may need to specify a more fully-qualified type name.. + + + + + Looks up a localized string similar to An exception occurred while initializing module '{0}'. + - The exception message was: {2} + - The Assembly that the module was trying to be loaded from was:{1} + Check the InnerException property of the exception for more information. If the exception occurred while creating an object in a DI container, you can exception.GetRootException() to help locate the root cause of the problem. + . + + + + + Looks up a localized string similar to An exception occurred while initializing module '{0}'. + - The exception message was: {1} + Check the InnerException property of the exception for more information. If the exception occurred + while creating an object in a DI container, you can exception.GetRootException() to help locate the + root cause of the problem. . + + + + + Looks up a localized string similar to Failed to load type for module {0}. + Error was: {1}.. + + + + + Looks up a localized string similar to HostControl cannot have null value when behavior attaches. . + + + + + Looks up a localized string similar to The HostControl property cannot be set after Attach method has been called.. + + + + + Looks up a localized string similar to HostControl type must be a TabControl.. + + + + + Looks up a localized string similar to The IModuleEnumerator interface is no longer used and has been replaced by ModuleCatalog.. + + + + + Looks up a localized string similar to The argument must be a valid absolute Uri to an assembly file.. + + + + + Looks up a localized string similar to The Target of the IDelegateReference should be of type {0}.. + + + + + Looks up a localized string similar to ItemsControl's ItemsSource property is not empty. + This control is being associated with a region, but the control is already bound to something else. + If you did not explicitly set the control's ItemSource property, + this exception may be caused by a change in the value of the inherited RegionManager attached property.. + + + + + Looks up a localized string similar to Mapping with the given type is already registered: {0}.. + + + + + Looks up a localized string similar to Module {0} depends on other modules that don't belong to the same group.. + + + + + Looks up a localized string similar to Module {0} was not found in the catalog.. + + + + + Looks up a localized string similar to The ModulePath cannot contain a null value or be empty. + + + + + Looks up a localized string similar to Failed to load type '{0}' from assembly '{1}'.. + + + + + Looks up a localized string similar to Navigation is already in progress on region with name '{0}'.. + + + + + Looks up a localized string similar to Navigation cannot proceed until a region is set for the RegionNavigationService.. + + + + + Looks up a localized string similar to The IRegionAdapter for the type {0} is not registered in the region adapter mappings. You can register an IRegionAdapter for this control by overriding the ConfigureRegionAdapterMappings method in the bootstrapper.. + + + + + Looks up a localized string similar to There is currently no moduleTypeLoader in the ModuleManager that can retrieve the specified module.. + + + + + Looks up a localized string similar to An exception has occurred while trying to add a view to region '{0}'. + - The most likely causing exception was was: '{1}'. + But also check the InnerExceptions for more detail or call .GetRootException(). . + + + + + Looks up a localized string similar to The member access expression does not access a property.. + + + + + Looks up a localized string similar to The expression is not a member access expression.. + + + + + Looks up a localized string similar to The referenced property is a static property.. + + + + + Looks up a localized string similar to The Attach method cannot be called when Region property is null.. + + + + + Looks up a localized string similar to The Region property cannot be set after Attach method has been called.. + + + + + Looks up a localized string similar to An exception occurred while creating a region with name '{0}'. The exception was: {1}. . + + + + + Looks up a localized string similar to The region being added already has a name of '{0}' and cannot be added to the region manager with a different name ('{1}').. + + + + + Looks up a localized string similar to The region name cannot be null or empty.. + + + + + Looks up a localized string similar to Region with the given name is already registered: {0}. + + + + + Looks up a localized string similar to This RegionManager does not contain a Region with the name '{0}'.. + + + + + Looks up a localized string similar to The region manager does not contain the {0} region.. + + + + + Looks up a localized string similar to View already exists in region.. + + + + + Looks up a localized string similar to View with name '{0}' already exists in the region.. + + + + + Looks up a localized string similar to Module {0} is marked for automatic initialization when the application starts, but it depends on modules that are marked as OnDemand initialization. To fix this error, mark the dependency modules for InitializationMode=WhenAvailable, or remove this validation by extending the ModuleCatalog class.. + + + + + Looks up a localized string similar to The provided String argument {0} must not be null or empty.. + + + + + Looks up a localized string similar to The provided String argument {0} must not be null or empty.. + + + + + Looks up a localized string similar to No BehaviorType with key '{0}' was registered.. + + + + + Looks up a localized string similar to An exception occurred while trying to create region objects. + - The most likely causing exception was: '{0}'. + But also check the InnerExceptions for more detail or call .GetRootException(). . + + + + + Looks up a localized string similar to The value must be of type ModuleInfo.. + + + + + Looks up a localized string similar to {0} not found.. + + + + + Looks up a localized string similar to The region does not contain the specified view.. + + + + + Region that keeps all the views in it as active. Deactivation of views is not allowed. + + + + + Gets a readonly view of the collection of all the active views in the region. These are all the added views. + + An of all the active views. + + + + Deactive is not valid in this Region. This method will always throw . + + The view to deactivate. + Every time this method is called. + + + + Populates the target region with the views registered to it in the . + + + + + The key of this behavior. + + + + + Creates a new instance of the AutoPopulateRegionBehavior + associated with the received. + + that the behavior will monitor for views to populate the region. + + + + Attaches the AutoPopulateRegionBehavior to the Region. + + + + + Returns a collection of views that will be added to the + View collection. + + + + + + Adds a view into the views collection of this region. + + + + + + Handler of the event that fires when a new viewtype is registered to the registry. + + Although this is a public method to support Weak Delegates in Silverlight, it should not be called by the user. + + + + + + Defines a behavior that forwards the + to the views in the region. + + + + + The key of this behavior. + + + + + Behavior's attached region. + + + + + Attaches the behavior to the specified region. + + + + + Behavior that removes the RegionManager attached property of all the views in a region once the RegionManager property of a region becomes null. + This is useful when removing views with nested regions, to ensure these nested regions get removed from the RegionManager as well. + + This behavior does not apply by default. + In order to activate it, the ClearChildViews attached property must be set to True in the view containing the affected child regions. + + + + + + The behavior key. + + + + + This attached property can be defined on a view to indicate that regions defined in it must be removed from the region manager when the parent view gets removed from a region. + + + + + Gets the ClearChildViews attached property from a DependencyObject. + + The object from which to get the value. + The value of the ClearChildViews attached property in the target specified. + + + + Sets the ClearChildViews attached property in a DependencyObject. + + The object in which to set the value. + The value of to set in the target object's ClearChildViews attached property. + + + + Subscribes to the 's PropertyChanged method to monitor its RegionManager property. + + + + + Behavior that creates a new , when the control that will host the (see ) + is added to the VisualTree. This behavior will use the class to find the right type of adapter to create + the region. After the region is created, this behavior will detach. + + + Attached property value inheritance is not available in Silverlight, so the current approach walks up the visual tree when requesting a region from a region manager. + The is now responsible for walking up the Tree. + + + + + Initializes a new instance of the class. + + + The region adapter mappings, that are used to find the correct adapter for + a given controltype. The controltype is determined by the value. + + + + + Sets a class that interfaces between the 's static properties/events and this behavior, + so this behavior can be tested in isolation. + + The region manager accessor. + + + + The element that will host the Region. + + The target element. + + + + Start monitoring the and the to detect when the becomes + part of the Visual Tree. When that happens, the Region will be created and the behavior will . + + + + + Stop monitoring the and the , so that this behavior can be garbage collected. + + + + + Called when the is updating it's collection. + + + This method has to be public, because it has to be callable using weak references in silverlight and other partial trust environments. + + The . + The instance containing the event data. + + + + Method that will create the region, by calling the right . + + The target element that will host the . + Name of the region. + The created + + + + Defines a that not allows extensible behaviors on regions which also interact + with the target element that the is attached to. + + + + + Gets or sets the that the is attached to. + + A that the is attached to. + This is usually a that is part of the tree. + + + + Behavior that monitors a object and + changes the value for the property when + an object that implements gets added or removed + from the collection. + + + This class can also sync the active state for any scoped regions directly on the view based on the . + If you use the method with the createRegionManagerScope option, the scoped manager will be attached to the view. + + + + + Name that identifies the behavior in a collection of . + + + + + The region that this behavior is extending + + + + + Attaches the behavior to the specified region + + + + + Detaches the behavior from the . + + + + + Represents errors that occured during region creation. + + + + + + + + Initializes a new instance of the + + + + + Initializes a new instance of the class with a specified error message. + + The message that describes the error. + + + + Initializes a new instance of the class with a specified error message and a reference + to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference + (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class with serialized data. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + + Subscribes to a static event from the in order to register the target + in a when one is available on the host control by walking up the tree and finding + a control whose property is not . + + + + + The key of this behavior. + + + + + Initializes a new instance of . + + + + + Provides an abstraction on top of the RegionManager static members. + + + + + Gets or sets the that the is attached to. + + A that the is attached to. + This is usually a that is part of the tree. + When this member is set after the method has being called. + + + + When the has a name assigned, the behavior will start monitoring the ancestor controls in the element tree + to look for an where to register the region in. + + + + + This event handler gets called when a RegionManager is requering the instances of a region to be registered if they are not already. + Although this is a public method to support Weak Delegates in Silverlight, it should not be called by the user. + + The sender. + The arguments. + + + + The RegionMemberLifetimeBehavior determines if items should be removed from the + when they are deactivated. + + + The monitors the + collection to discover items that transition into a deactivated state. +

+ The behavior checks the removed items for either the + or the (in that order) to determine if it should be kept + alive on removal. +

+ If the item in the collection is a , it will + also check it's DataContext for or the . +

+ The order of checks are: + + Region Item's IRegionMemberLifetime.KeepAlive value. + Region Item's DataContext's IRegionMemberLifetime.KeepAlive value. + Region Item's RegionMemberLifetimeAttribute.KeepAlive value. + Region Item's DataContext's RegionMemberLifetimeAttribute.KeepAlive value. + + + + +

+ The key for this behavior. + +
+ + + Override this method to perform the logic after the behavior has been attached. + + + + + Defines the attached behavior that keeps the items of the host control in synchronization with the . + + This behavior also makes sure that, if you activate a view in a region, the SelectedItem is set. If you set the SelectedItem or SelectedItems (ListBox) + then this behavior will also call Activate on the selected items. + + When calling Activate on a view, you can only select a single active view at a time. By setting the SelectedItems property of a listbox, you can set + multiple views to active. + + + + + + Name that identifies the SelectorItemsSourceSyncBehavior behavior in a collection of RegionsBehaviors. + + + + + Gets or sets the that the is attached to. + + + A that the is attached to. + + For this behavior, the host control must always be a or an inherited class. + + + + Starts to monitor the to keep it in synch with the items of the . + + + + + Behavior that synchronizes the property of a with + the control that hosts the Region. It does this by setting the + Dependency Property on the host control. + + This behavior allows the usage of two way databinding of the RegionContext from XAML. + + + + + Name that identifies the SyncRegionContextWithHostBehavior behavior in a collection of RegionsBehaviors. + + + + + Gets or sets the that the is attached to. + + + A that the is attached to. + This is usually a that is part of the tree. + + + + + Override this method to perform the logic after the behavior has been attached. + + + + + Adapter that creates a new and monitors its + active view to set it on the adapted . + + + + + Initializes a new instance of . + + The factory used to create the region behaviors to attach to the created regions. + + + + Adapts a to an . + + The new region being used. + The object to adapt. + + + + Creates a new instance of . + + A new instance of . + + + + Notification used by attached behaviors to update the region managers appropriatelly if needed to. + + This event uses weak references to the event handler to prevent this static event of keeping the + target element longer than expected. + + + + Gets the value for the RegionName attached property. + + The object to adapt. This is typically a container (i.e a control). + The name of the region that should be created when + the RegionManager is also set in this element. + + + + Gets the value of the RegionName attached property. + + The target element. + The attached to the element. + + + + Provides a way for objects involved in navigation to determine if a navigation request should continue. + + + + + Determines whether this instance accepts being navigated away from. + + The navigation context. + The callback to indicate when navigation can proceed. + + Implementors of this method do not need to invoke the callback before this method is completed, + but they must ensure the callback is eventually invoked. + + + + + Provides methods to perform navigation. + + + Convenience overloads for the methods in this interface can be found as extension methods on the + class. + + + + + Initiates navigation to the target specified by the . + + The navigation target + The callback executed when the navigation request is completed. + + Convenience overloads for this method can be found as extension methods on the + class. + + + + + Initiates navigation to the target specified by the . + + The navigation target + The callback executed when the navigation request is completed. + The navigation parameters specific to the navigation request. + + Convenience overloads for this method can be found as extension methods on the + class. + + + + + Provides a way for objects involved in navigation to be notified of navigation activities. + + + + + Called when the implementer has been navigated to. + + The navigation context. + + + + Called to determine if this instance can handle the navigation request. + + The navigation context. + + if this instance accepts the navigation request; otherwise, . + + + + + Called when the implementer is being navigated away from. + + The navigation context. + + + + Defines a model that can be used to compose views. + + + + + Gets a readonly view of the collection of views in the region. + + An of all the added views. + + + + Gets a readonly view of the collection of all the active views in the region. + + An of all the active views. + + + + Gets or sets a context for the region. This value can be used by the user to share context with the views. + + The context value to be shared. + + + + Gets the name of the region that uniequely identifies the region within a . + + The name of the region. + + + + Gets or sets the comparison used to sort the views. + + The comparison to use. + + + Adds a new view to the region. + + Adds a new view to the region. + + The view to add. + The that is set on the view if it is a . It will be the current region manager when using this overload. + + + + Adds a new view to the region. + + The view to add. + The name of the view. This can be used to retrieve it later by calling . + The that is set on the view if it is a . It will be the current region manager when using this overload. + + + + Adds a new view to the region. + + The view to add. + The name of the view. This can be used to retrieve it later by calling . + When , the added view will receive a new instance of , otherwise it will use the current region manager for this region. + The that is set on the view if it is a . + + + + Removes the specified view from the region. + + The view to remove. + + + + Removes all views from the region. + + + + + Marks the specified view as active. + + The view to activate. + + + + Marks the specified view as inactive. + + The view to deactivate. + + + + Returns the view instance that was added to the region using a specific name. + + The name used when adding the view to the region. + Returns the named view or if the view with does not exist in the current region. + + + + Gets or sets the that will be passed to the views when adding them to the region, unless the view is added by specifying createRegionManagerScope as . + + The where this is registered. + This is usually used by implementations of and should not be + used by the developer explicitely. + + + + Gets the collection of s that can extend the behavior of regions. + + + + + Gets or sets the navigation service. + + The navigation service. + + + + Defines an interfaces to adapt an object and bind it to a new . + + + + + Adapts an object and binds it to a new . + + The object to adapt. + The name of the region to be created. + The new instance of that the is bound to. + + + + Interface for allowing extensible behavior on regions. + + + + + The region that this behavior is extending. + + + + + Attaches the behavior to the specified region. + + + + + Defines the interface for a collection of classes on a Region. + + + + + Adds a to the collection, using the specified key as an indexer. + + + The key that specifies the type of that's added. + + The to add. + + + + Checks if a with the specified key is already present. + + The key to use to find a particular . + + + + + Gets the with the specified key. + + The registered + + + + Interface for RegionBehaviorFactories. This factory allows the registration of the default set of RegionBehaviors, that will + be added to the s of all s, unless overridden on a 'per-region' basis. + + + + + Adds a particular type of RegionBehavior if it was not already registered. the string is used to check if the behavior is already present + + The behavior key that's used to find if a certain behavior is already added. + Type of the behavior to add. . + + + + Determines whether a behavior with the specified key already exists + + The behavior key. + + if a behavior with the specified key is present; otherwise, . + + + + + Creates an instance of the Behaviortype that's registered using the specified key. + + The key that's used to register a behavior type. + The created behavior. + + + + Defines a collection of uniquely identified by their Name. + + + + + Gets the IRegion with the name received as index. + + Name of the region to be retrieved. + The identified with the requested name. + + + + Adds a to the collection. + + Region to be added to the collection. + + + + Removes a from the collection. + + Name of the region to be removed. + if the region was removed from the collection, otherwise . + + + + Checks if the collection contains a with the name received as parameter. + + The name of the region to look for. + if the region is contained in the collection, otherwise . + + + + Adds a region to the regionmanager with the name received as argument. + + The name to be given to the region. + The region to be added to the regionmanager. + Thrown if is . + Thrown if and 's name do not match and the is not . + + + + Defines an interface to manage a set of regions and to attach regions to objects (typically controls). + + + + + Gets a collection of that identify each region by name. You can use this collection to add or remove regions to the current region manager. + + + + + Creates a new region manager. + + A new region manager that can be used as a different scope from the current region manager. + + + + Add a view to the Views collection of a Region. Note that the region must already exist in this regionmanager. + + The name of the region to add a view to + The view to add to the views collection + The RegionManager, to easily add several views. + + + + Associate a view with a region, by registering a type. When the region get's displayed + this type will be resolved using the ServiceLocator into a concrete instance. The instance + will be added to the Views collection of the region + + The name of the region to associate the view with. + The type of the view to register with the + The regionmanager, for adding several views easily + + + + Associate a view with a region, using a delegate to resolve a concrete instance of the view. + When the region get's displayed, this delegate will be called and the result will be added to the + views collection of the region. + + The name of the region to associate the view with. + The delegate used to resolve a concrete instance of the view. + The regionmanager, for adding several views easily + + + + Navigates the specified region manager. + + The name of the region to call Navigate on. + The URI of the content to display. + The navigation callback. + + + + Navigates the specified region manager. + + The name of the region to call Navigate on. + The URI of the content to display. + + + + Navigates the specified region manager. + + The name of the region to call Navigate on. + The URI of the content to display. + The navigation callback. + + + + Navigates the specified region manager. + + The name of the region to call Navigate on. + The URI of the content to display. + + + + This method allows an IRegionManager to locate a specified region and navigate in it to the specified target Uri, passing a navigation callback and an instance of NavigationParameters, which holds a collection of object parameters. + + The name of the region where the navigation will occur. + A Uri that represents the target where the region will navigate. + The navigation callback that will be executed after the navigation is completed. + An instance of NavigationParameters, which holds a collection of object parameters. + + + + This method allows an IRegionManager to locate a specified region and navigate in it to the specified target string, passing a navigation callback and an instance of NavigationParameters, which holds a collection of object parameters. + + The name of the region where the navigation will occur. + A string that represents the target where the region will navigate. + The navigation callback that will be executed after the navigation is completed. + An instance of NavigationParameters, which holds a collection of object parameters. + + + + This method allows an IRegionManager to locate a specified region and navigate in it to the specified target Uri, passing an instance of NavigationParameters, which holds a collection of object parameters. + + The name of the region where the navigation will occur. + A Uri that represents the target where the region will navigate. + An instance of NavigationParameters, which holds a collection of object parameters. + + + + This method allows an IRegionManager to locate a specified region and navigate in it to the specified target string, passing an instance of NavigationParameters, which holds a collection of object parameters. + + The name of the region where the navigation will occur. + A string that represents the target where the region will navigate. + An instance of NavigationParameters, which holds a collection of object parameters. + + + + Provides an abstraction on top of the RegionManager static members. + + + + + Notification used by attached behaviors to update the region managers appropriatelly if needed to. + + This event uses weak references to the event handler to prevent this static event of keeping the + target element longer than expected. + + + + Gets the value for the RegionName attached property. + + The object to adapt. This is typically a container (i.e a control). + The name of the region that should be created when + the RegionManager is also set in this element. + + + + Gets the value of the RegionName attached property. + + The target element. + The attached to the element. + + + + When implemented, allows an instance placed in a + that uses a to indicate + it should be removed when it transitions from an activated to deactived state. + + + + + Gets a value indicating whether this instance should be kept-alive upon deactivation. + + + + + Identifies the view in a region that is the target of a navigation request. + + + + + Gets the content to which the navigation request represented by applies. + + + If none of the items in the region match the target of the navigation request, a new item + will be created and added to the region. + + The region. + The context representing the navigation request. + The item to be the target of the navigation request. + when a new item cannot be created for the navigation request. + + + + Provides journaling of current, back, and forward navigation within regions. + + + + + Gets a value that indicates whether there is at least one entry in the back navigation history. + + + true if the journal can go back; otherwise, false. + + + + + Gets a value that indicates whether there is at least one entry in the forward navigation history. + + + true if this instance can go forward; otherwise, false. + + + + + Gets the current navigation entry of the content that is currently displayed. + + The current entry. + + + + Gets or sets the target that implements INavigateAsync. + + The INavigate implementation. + + This is set by the owner of this journal. + + + + + Navigates to the most recent entry in the back navigation history, or does nothing if no entry exists in back navigation. + + + + + Navigates to the most recent entry in the forward navigation history, or does nothing if no entry exists in forward navigation. + + + + + Records the navigation to the entry.. + + The entry to record. + + + + Clears the journal of current, back, and forward navigation histories. + + + + + An entry in an IRegionNavigationJournal representing the URI navigated to. + + + + + Gets or sets the URI. + + The URI. + + + + Gets or sets the NavigationParameters instance. + + + + + Provides navigation for regions. + + + + + Gets or sets the region owning this service. + + A Region. + + + + Gets the journal. + + The journal. + + + + Raised when the region is about to be navigated to content. + + + + + Raised when the region is navigated to content. + + + + + Raised when a navigation request fails. + + + + + Defines the interface for the registry of region's content. + + + + + Event triggered when a content is registered to a region name. + + + This event uses weak references to the event handler to prevent this service (typically a singleton) of keeping the + target element longer than expected. + + + + + Returns the contents associated with a region name. + + Region name for which contents are requested. + Collection of contents associated with the . + + + + Registers a content type with a region name. + + Region name to which the will be registered. + Content type to be registered for the . + + + + Registers a delegate that can be used to retrieve the content associated with a region name. + + Region name to which the will be registered. + Delegate used to retrieve the content associated with the . + + + + Defines a class that wraps an item and adds metadata for it. + + + + + The name of the wrapped item. + + + + + Value indicating whether the wrapped item is considered active. + + + + + Initializes a new instance of . + + The item to wrap. + + + + Gets the wrapped item. + + The wrapped item. + + + + Gets or sets a name for the wrapped item. + + The name of the wrapped item. + + + + Gets or sets a value indicating whether the wrapped item is considered active. + + if the item should be considered active; otherwise . + + + + Occurs when metadata on the item changes. + + + + + Explicitly invokes to notify listeners. + + + + + Adapter that creates a new and binds all + the views to the adapted . + + + + + Initializes a new instance of . + + The factory used to create the region behaviors to attach to the created regions. + + + + Adapts an to an . + + The new region being used. + The object to adapt. + + + + Creates a new instance of . + + A new instance of . + + + + Defines a view of a collection. + + + + + Determines whether the collection contains a specific value. + + The object to locate in the collection. + if is found in the collection; otherwise, . + + + + Provides additional methods to the interface. + + + + + Initiates navigation to the target specified by the . + + The navigation object. + The navigation target + + + + Initiates navigation to the target specified by the . + + The navigation object. + The navigation target + The callback executed when the navigation request is completed. + + + + Initiates navigation to the target specified by the . + + The navigation object. + The navigation target + + + + Initiates navigation to the target specified by the . + + The navigation object. + The navigation target + The callback executed when the navigation request is completed. + An instance of NavigationParameters, which holds a collection of object parameters. + + + + Initiates navigation to the target specified by the . + + The navigation object. + A Uri that represents the target where the region will navigate. + An instance of NavigationParameters, which holds a collection of object parameters. + + + + Initiates navigation to the target specified by the . + + The navigation object. + A string that represents the target where the region will navigate. + An instance of NavigationParameters, which holds a collection of object parameters. + + + + Encapsulates information about a navigation request. + + + + + Initializes a new instance of the class for a region name and a + . + + The navigation service. + The Uri. + + + + Initializes a new instance of the class for a region name and a + . + + The navigation service. + The navigation parameters. + The Uri. + + + + Gets the region navigation service. + + The navigation service. + + + + Gets the navigation URI. + + The navigation URI. + + + + Gets the extracted from the URI and the object parameters passed in navigation. + + The URI query. + + + + Represents Navigation parameters. + + + This class can be used to to pass object parameters during Navigation. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a query string. + + The query string. + + + + Gets the with the specified key. + + The value for the specified key, or if the query does not contain such a key. + + + + Gets the enumerator. + + + + + + Adds the specified key and value. + + The name. + The value. + + + + Converts the list of key value pairs to a query string. + + + + + + Represents the result of navigating to a URI. + + + + + Initializes a new instance of the class. + + The context. + The result. + + + + Initializes a new instance of the class. + + The context. + The error. + + + + Gets the result. + + The result. + + + + Gets an exception that occurred while navigating. + + The exception. + + + + Gets the navigation context. + + The navigation context. + + + + Implementation of that allows multiple active views. + + + + + Initializes a new instance of . + + + + + Occurs when a property value changes. + + + + + Gets the collection of s that can extend the behavior of regions. + + + + + Gets or sets a context for the region. This value can be used by the user to share context with the views. + + The context value to be shared. + + + + Gets the name of the region that uniequely identifies the region within a . + + The name of the region. + + + + Gets a readonly view of the collection of views in the region. + + An of all the added views. + + + + Gets a readonly view of the collection of all the active views in the region. + + An of all the active views. + + + + Gets or sets the comparison used to sort the views. + + The comparison to use. + + + + Gets or sets the that will be passed to the views when adding them to the region, unless the view is added by specifying createRegionManagerScope as . + + The where this is registered. + This is usually used by implementations of and should not be + used by the developer explicitely. + + + + Gets the navigation service. + + The navigation service. + + + + Gets the collection with all the views along with their metadata. + + An of with all the added views. + + + Adds a new view to the region. + + Adds a new view to the region. + + The view to add. + The that is set on the view if it is a . It will be the current region manager when using this overload. + + + + Adds a new view to the region. + + The view to add. + The name of the view. This can be used to retrieve it later by calling . + The that is set on the view if it is a . It will be the current region manager when using this overload. + + + + Adds a new view to the region. + + The view to add. + The name of the view. This can be used to retrieve it later by calling . + When , the added view will receive a new instance of , otherwise it will use the current region manager for this region. + The that is set on the view if it is a . + + + + Removes the specified view from the region. + + The view to remove. + + + + Removes all views from the region. + + + + + Marks the specified view as active. + + The view to activate. + + + + Marks the specified view as inactive. + + The view to deactivate. + + + + Returns the view instance that was added to the region using a specific name. + + The name used when adding the view to the region. + Returns the named view or if the view with does not exist in the current region. + + + + Initiates navigation to the specified target. + + The target. + A callback to execute when the navigation request is completed. + + + + Initiates navigation to the specified target. + + The target. + A callback to execute when the navigation request is completed. + The navigation parameters specific to the navigation request. + + + + The default sort algorithm. + + The first view to compare. + The second view to compare. + + + + + Base class to facilitate the creation of implementations. + + Type of object to adapt. + + + + Initializes a new instance of . + + The factory used to create the region behaviors to attach to the created regions. + + + + Gets or sets the factory used to create the region behaviors to attach to the created regions. + + + + + Adapts an object and binds it to a new . + + The object to adapt. + The name of the region to be created. + The new instance of that the is bound to. + + + + Adapts an object and binds it to a new . + + The object to adapt. + The name of the region to be created. + The new instance of that the is bound to. + This methods performs validation to check that + is of type . + When is . + When is not of type . + + + + This method adds the default behaviors by using the object. + + The region being used. + The object to adapt. + + + + Template method to attach new behaviors. + + The region being used. + The object to adapt. + + + + Template method to adapt the object to an . + + The new region being used. + The object to adapt. + + + + Template method to create a new instance of + that will be used to adapt the object. + + A new instance of . + + + + This class maps with . + + + + + Registers the mapping between a type and an adapter. + + The type of the control. + The adapter to use with the type. + When any of or are . + If a mapping for already exists. + + + + Returns the adapter associated with the type provided. + + The type to obtain the mapped. + The mapped to the . + This class will look for a registered type for and if there is not any, + it will look for a registered type for any of its ancestors in the class hierarchy. + If there is no registered type for or any of its ancestors, + an exception will be thrown. + When there is no registered type for or any of its ancestors. + + + + Provides a base class for region's behaviors. + + + + + Behavior's attached region. + + + + + Returns if the behavior is attached to a region, otherwise. + + + + + Attaches the behavior to the region. + + + + + Override this method to perform the logic after the behavior has been attached. + + + + + A collection of instances, that are stored and retrieved by Key. + + + + + Initializes a new instance of the class and associates it with a region. + + The region to associate the behavior collection with. + + + + Gets the with the specified key. + + The RegionBehavior that's registered with the key. + + + + Adds a to the collection, using the specified key as an indexer. + + The key that specifies the type of that's added. + The to add. + + Thrown is the parameter is Null, + or if the parameter is Null. + + Thrown if a behavior with the specified Key parameter already exists. + + + + Checks if a with the specified key is already present. + + The key to use to find a particular . + + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Defines a factory that allows the registration of the default set of , that will + be added to the of all s, unless overridden on a 'per-region' basis. + + + + + Initializes a new instance of . + + used to create the instance of the behavior from its . + + + + Adds a particular type of RegionBehavior if it was not already registered. The string is used to check if the behavior is already present + + The behavior key that's used to find if a certain behavior is already added. + Type of the behavior to add. + + + + Creates an instance of the behavior that is registered using the specified key. + + The key that is used to register a behavior type. + A new instance of the behavior. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + 2 + + + + Determines whether a behavior with the specified key already exists. + + The behavior key. + + if a behavior with the specified key is present; otherwise, . + + + + + Class that holds methods to Set and Get the RegionContext from a DependencyObject. + + RegionContext allows sharing of contextual information between the view that's hosting a + and any views that are inside the Region. + + + + + Returns an wrapper around the RegionContext value. The RegionContext + will be set on any views (dependency objects) that are inside the collection by + the Behavior. + The RegionContext will also be set to the control that hosts the Region, by the Behavior. + + If the wrapper does not already exist, an empty one will be created. This way, an observer can + notify when the value is set for the first time. + + Any view that hold the RegionContext value. + Wrapper around the Regioncontext value. + + + + This class is responsible for maintaining a collection of regions and attaching regions to controls. + + + This class supplies the attached properties that can be used for simple region creation from XAML. + + + + + Identifies the RegionName attached property. + + + When a control has both the and + attached properties set to + a value different than and there is a + mapping registered for the control, it + will create and adapt a new region for that control, and register it + in the with the specified region name. + + + + + Sets the attached property. + + The object to adapt. This is typically a container (i.e a control). + The name of the region to register. + + + + Gets the value for the attached property. + + The object to adapt. This is typically a container (i.e a control). + The name of the region that should be created when + is also set in this element. + + + + Returns an wrapper that can hold an . Using this wrapper + you can detect when an has been created by the . + + If the wrapper does not yet exist, a new wrapper will be created. When the region + gets created and assigned to the wrapper, you can use the event + to get notified of that change. + + The view that will host the region. + Wrapper that can hold an value and can notify when the value changes. + + + + Identifies the RegionManager attached property. + + + When a control has both the and + attached properties set to + a value different than and there is a + mapping registered for the control, it + will create and adapt a new region for that control, and register it + in the with the specified region name. + + + + + Gets the value of the attached property. + + The target element. + The attached to the element. + + + + Sets the attached property. + + The target element. + The value. + + + + Identifies the RegionContext attached property. + + + + + Gets the value of the attached property. + + The target element. + The region context to pass to the contained views. + + + + Sets the attached property. + + The target element. + The value. + + + + Notification used by attached behaviors to update the region managers appropriatelly if needed to. + + This event uses weak references to the event handler to prevent this static event of keeping the + target element longer than expected. + + + + Notifies attached behaviors to update the region managers appropriatelly if needed to. + + + This method is normally called internally, and there is usually no need to call this from user code. + + + + + Initializes a new instance of . + + + + + Gets a collection of that identify each region by name. You can use this collection to add or remove regions to the current region manager. + + A with all the registered regions. + + + + Creates a new region manager. + + A new region manager that can be used as a different scope from the current region manager. + + + + Add a view to the Views collection of a Region. Note that the region must already exist in this regionmanager. + + The name of the region to add a view to + The view to add to the views collection + The RegionManager, to easily add several views. + + + + Associate a view with a region, by registering a type. When the region get's displayed + this type will be resolved using the ServiceLocator into a concrete instance. The instance + will be added to the Views collection of the region + + The name of the region to associate the view with. + The type of the view to register with the + The regionmanager, for adding several views easily + + + + Associate a view with a region, using a delegate to resolve a concrete instance of the view. + When the region get's displayed, this delegate will be called and the result will be added to the + views collection of the region. + + The name of the region to associate the view with. + The delegate used to resolve a concrete instance of the view. + The regionmanager, for adding several views easily + + + + Navigates the specified region manager. + + The name of the region to call Navigate on. + The URI of the content to display. + The navigation callback. + + + + Navigates the specified region manager. + + The name of the region to call Navigate on. + The URI of the content to display. + + + + Navigates the specified region manager. + + The name of the region to call Navigate on. + The URI of the content to display. + The navigation callback. + + + + Navigates the specified region manager. + + The name of the region to call Navigate on. + The URI of the content to display. + + + + This method allows an IRegionManager to locate a specified region and navigate in it to the specified target Uri, passing a navigation callback and an instance of NavigationParameters, which holds a collection of object parameters. + + The name of the region where the navigation will occur. + A Uri that represents the target where the region will navigate. + The navigation callback that will be executed after the navigation is completed. + An instance of NavigationParameters, which holds a collection of object parameters. + + + + This method allows an IRegionManager to locate a specified region and navigate in it to the specified target string, passing a navigation callback and an instance of NavigationParameters, which holds a collection of object parameters. + + The name of the region where the navigation will occur. + A string that represents the target where the region will navigate. + The navigation callback that will be executed after the navigation is completed. + An instance of NavigationParameters, which holds a collection of object parameters. + + + + This method allows an IRegionManager to locate a specified region and navigate in it to the specified target Uri, passing an instance of NavigationParameters, which holds a collection of object parameters. + + The name of the region where the navigation will occur. + A Uri that represents the target where the region will navigate. + An instance of NavigationParameters, which holds a collection of object parameters. + + + + This method allows an IRegionManager to locate a specified region and navigate in it to the specified target string, passing an instance of NavigationParameters, which holds a collection of object parameters. + + The name of the region where the navigation will occur. + A string that represents the target where the region will navigate. + An instance of NavigationParameters, which holds a collection of object parameters. + + + + Adds a region to the regionmanager with the name received as argument. + + The name to be given to the region. + The region to be added to the regionmanager. + Thrown if is . + Thrown if and 's name do not match and the is not . + + + + When is applied to class provides data + the can use to determine if the instance should + be removed when it is deactivated. + + + + + Instantiates an instance of + + + + + Determines if the region member should be kept-alive + when deactivated. + + + + + Implementation of that relies on a + to create new views when necessary. + + + + + Initializes a new instance of the class with a service locator. + + The service locator. + + + + Gets the view to which the navigation request represented by applies. + + The region. + The context representing the navigation request. + + The view to be the target of the navigation request. + + + If none of the views in the region can be the target of the navigation request, a new view + is created and added to the region. + + when a new view cannot be created for the navigation request. + + + + Provides a new item for the region based on the supplied candidate target contract name. + + The target contract to build. + An instance of an item to put into the . + + + + Returns the candidate TargetContract based on the . + + The navigation contract. + The candidate contract to seek within the and to use, if not found, when resolving from the container. + + + + Returns the set of candidates that may satisfiy this navigation request. + + The region containing items that may satisfy the navigation request. + The candidate navigation target as determined by + An enumerable of candidate objects from the + + + + EventArgs used with the Navigated event. + + + + + Initializes a new instance of the class. + + The navigation context. + + + + Gets the navigation context. + + The navigation context. + + + + Gets the navigation URI + + The URI. + + This is a convenience accessor around NavigationContext.Uri. + + + + + EventArgs used with the NavigationFailed event. + + + + + Initializes a new instance of the class. + + The navigation context. + + + + Initializes a new instance of the class. + + The navigation context. + The error. + + + + Gets the navigation context. + + The navigation context. + + + + Gets the error. + + The , or if the failure was not caused by an exception. + + + + Gets the navigation URI + + The URI. + + This is a convenience accessor around NavigationContext.Uri. + + + + + Provides journaling of current, back, and forward navigation within regions. + + + + + Gets or sets the target that implements INavigate. + + The INavigate implementation. + + This is set by the owner of this journal. + + + + + Gets the current navigation entry of the content that is currently displayed. + + The current entry. + + + + Gets a value that indicates whether there is at least one entry in the back navigation history. + + true if the journal can go back; otherwise, false. + + + + Gets a value that indicates whether there is at least one entry in the forward navigation history. + + + true if this instance can go forward; otherwise, false. + + + + + Navigates to the most recent entry in the back navigation history, or does nothing if no entry exists in back navigation. + + + + + Navigates to the most recent entry in the forward navigation history, or does nothing if no entry exists in forward navigation. + + + + + Records the navigation to the entry.. + + The entry to record. + + + + Clears the journal of current, back, and forward navigation histories. + + + + + An entry in an IRegionNavigationJournal representing the URI navigated to. + + + + + Gets or sets the URI. + + The URI. + + + + Gets or sets the NavigationParameters instance. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Provides navigation for regions. + + + + + Initializes a new instance of the class. + + The service locator. + The navigation target handler. + The journal. + + + + Gets or sets the region. + + The region. + + + + Gets the journal. + + The journal. + + + + Raised when the region is about to be navigated to content. + + + + + Raised when the region is navigated to content. + + + + + Raised when a navigation request fails. + + + + + Initiates navigation to the specified target. + + The target. + A callback to execute when the navigation request is completed. + + + + Initiates navigation to the specified target. + + The target. + A callback to execute when the navigation request is completed. + The navigation parameters specific to the navigation request. + + + + Defines a registry for the content of the regions used on View Discovery composition. + + + + + Creates a new instance of the class. + + used to create the instance of the views from its . + + + + Occurs whenever a new view is registered. + + + + + Returns the contents registered for a region. + + Name of the region which content is being requested. + Collection of contents registered for the region. + + + + Registers a content type with a region name. + + Region name to which the will be registered. + Content type to be registered for the . + + + + Registers a delegate that can be used to retrieve the content associated with a region name. + + Region name to which the will be registered. + Delegate used to retrieve the content associated with the . + + + + Creates an instance of a registered view . + + Type of the registered view. + Instance of the registered view. + + + + Adapter that creates a new and binds all + the views to the adapted . + It also keeps the and the selected items + of the in sync. + + + + + Initializes a new instance of . + + The factory used to create the region behaviors to attach to the created regions. + + + + Adapts an to an . + + The new region being used. + The object to adapt. + + + + Attach new behaviors. + + The region being used. + The object to adapt. + + This class attaches the base behaviors and also listens for changes in the + activity of the region or the control selection and keeps the in sync. + + + + + Creates a new instance of . + + A new instance of . + + + + Region that allows a maximum of one active view at a time. + + + + + Marks the specified view as active. + + The view to activate. + If there is an active view before calling this method, + that view will be deactivated automatically. + + + + Defines that a view is synchronized with its parent view's Active state. + + + + + Represents errors that occured during the regions' update. + + + Represents errors that occured during the regions' update. + + + + + Initializes a new instance of the + + + + + Initializes a new instance of the class with a specified error message. + + The message that describes the error. + + + + Initializes a new instance of the class with a specified error message and a reference + to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference + (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class with serialized data. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + + Argument class used by the event when a new content is registered. + + + + + Initializes the ViewRegisteredEventArgs class. + + The region name to which the content was registered. + The content which was registered. + + + + Gets the region name to which the content was registered. + + + + + Gets the content which was registered. + + + + + Exception that's thrown when something goes wrong while Registering a View with a region name in the class. + + + Exception that's thrown when something goes wrong while Registering a View with a region name in the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The exception message. + + + + Initializes a new instance of the class. + + The exception message. + The inner exception. + + + + Initializes a new instance of the class with serialized data. + + The that holds the serialized + object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + + Implementation of that takes an of + and filters it to display an collection of + elements (the items which the wraps). + + + + + Initializes a new instance of the class. + + The list to wrap and filter. + A predicate to filter the collection. + + + + Occurs when the collection changes. + + + + + Gets or sets the comparison used to sort the views. + + The comparison to use. + + + + Determines whether the collection contains a specific value. + + The object to locate in the collection. + if is found in the collection; otherwise, . + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Used to invoked the event. + + + + + + Removes all monitoring of underlying MetadataItems and re-adds them. + + + + + Adds all underlying MetadataItems to the list from the subjectCollection + + + + + Removes all monitored items from our monitoring list. + + + + + Adds handler to monitor the MetadatItem and adds it to our monitoring list. + + + + + + + Unhooks from the MetadataItem change event and removes from our monitoring list. + + + + + + Invoked when any of the underlying ItemMetadata items we're monitoring changes. + + + + + + + The event handler due to changes in the underlying collection. + + + + + + + Provides a hint from a view to a region on how to sort the view. + + + + + Initializes a new instance of the class. + + The hint to use for sorting. + + + + Gets the hint. + + The hint to use for sorting. + + + + Class that provides extension methods to Collection + + + + + Add a range of items to a collection. + + Type of objects within the collection. + The collection to add items to. + The items to add to the collection. + The collection. + An is thrown if or is . + + + + Class that provides extension methods for the Exception class. These extension methods provide + a mechanism for developers to get more easily to the root cause of an exception, especially in combination with + DI-containers such as Unity. + + + + + Register the type of an Exception that is thrown by the framework. The method uses + this list of Exception types to find out if something has gone wrong. + + The type of exception to register. + + + + Determines whether the exception type is already registered using the + method + + The type of framework exception to find. + + true if the exception type is already registered; otherwise, false. + + + + + Looks at all the inner exceptions of the parameter to find the + most likely root cause of the exception. This works by skipping all registered exception types. + + + This method is not 100% accurate and should only be used to point a developer into the most likely direction. + It should not be used to replace the Inner Exception stack of an exception, because this might hide required exception + information. + + The exception that will provide the list of inner exeptions to examine. + + The exception that most likely caused the exception to occur. If it can't find the root exception, it will return the + value itself. + + + + + Defines extension methods for the class. + + + + + Attempts to resolve specified type from the underlying . + + + This will return null on any . + Locator to use in resolving. + Type to resolve. + T or null + Thrown when is . + + + + Attempts to resolve specified type from the underlying . + + + This will return null on any . + Type to resolve. + Locator to use in resolving. + T or null + + + diff --git a/Katteker.Test/testdata/Prism.dll b/Katteker.Test/testdata/Prism.dll new file mode 100644 index 0000000000000000000000000000000000000000..1bb0ff8c434b09b9704ce3e60507d4b2ed6b924b GIT binary patch literal 31744 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Ŧ)RXPz9S7Suh+xx1w`I667s#!|d5fkS9!Faa+Lyh|XxDva7nRvJd z7xv@B*w+gW_Ks6nz1PzamOl%nknq+-GAVx(O7`($;j9(z;4|;u@Yd|+u+-UM#ju4N z=C^lZ(R3`+5N_EN?zMWtc)25tt+jMIAq>3lYS&RG`58I578aaHh;GNcW)*QZeG1P5 zctaP`J2R8QasbIMjo>d<;cd2P3{Of38r1)Vf>saK+DHmUvo_`AvkfOr%1H?q?7>Py zGD&M|JY5$?BXd?%BEp;S`VwmpPbRu>9-WP6grh6kndpF7Y#OuXOyqv!whJ$AOexRS>RbV{#=Em+^K zOox?DCfe)5j%V5O>caL3)7+GL!K5xMXVe|oO_T%Kx$P&O7@g5EV`k&*Y189VX3ZXV zY-Q^GC#O#A(eb#z_h{v_vS|VT*RMYMkkPQ=V9BU4&$T={?nUeA%inl^?YOtUGx>_D zi(efdIk51xDbZCQENV4=al!d$*tIB(FMiRzki`uhiZFi~(q*_-*`o22lY}3FrKN=% zTl~oWf3=YZp>sY>;AidSod5w-d4uY|ww>35VoL_@YZdRq4b1)I9lhHiY~?`qVqwLb zVE@df-n$UG{J(c!Z#;VTv|>#LYR&!0n>GK;*4~v6H>+6Oz@4s7-rf5a3ZFBOec%S% zV4Gq8{0842P{pRts^Y(AkMDSllh)6w>i=Y$?@S2R>YL@|kg#(|7>g z33=D1L0d48ooAp7Vl7W2{L)D{%kO}4kzCF|c@5g6zQ!FVh5M%NXb3w;3qYp<<(D5Z z^K^Be)Hmg%o*fNZ%knr*dE;pjSM(ZdIAtknNA6t_b@U#N*{?Qc_>Um+Y?s2BM1yu> zYj_iiI4>taEmn9=>nUMOWOzXab3qty@!&j5MDsxgPvH$3PKI-{t@B!U*pkCJk?0)N zW7@0}J>|?Sf6yE5>dDAoV#Ki#<_~#6JZvcot!+UGeoq`$vEORQX&AmlKI?rbtI$j-{kY0w&_!aT2Iu}_rNpw)8`e*Z&S5X&otvQb`M;MJ-e5%Vd3mPGs$ zSD(5(vhMKrzPkAIGk^KTx3bqgarOPz#h-rlFK>NI|Hr0pJbbtD*yDBI7&-phf4%6q zw?Ak8=68=rd`80~XI=c}>nHu?w=d7EUHj4RZuwIG@)`HVXa3ufcaQ51J~1q~zGm_j zJ?6zP?0M`zPd%D7o3Hup)Sp~-bkf7yUUL7ho>9L&^S8~5UccqK(Zg5==Wk(RbkIl) z^LsEc-;*I)y=K80_u_}|`QC^By71;zKV6oZaOSJXrsk72@=KnXjq{gAJ9|>m%*F*) zhdM&txHyqr($l_C)|4C9$cwKw0!Q13Hy3#&rzj2Gv39Qhf8^(Vp5*P1|2ibX4pw}3 z{@$gcwl!Pn19Zaz;X7m38xtR884+;k;~^Q8JudU^Cvm66OIR5tq`g~ zCq6Gs$hpa}lJF-Gz%wQHZ#vFZc-1@{R4sRgt4@qCJmoXCAg^2M&z}O?Ecl){wiI%j z^CD%ClO{0pl&emn31=&XW!A|;hEJ27HqFF|&NN)C-*kM}P!o%&lcyB)NaoHW3*|Q8 zbSQ~`+=oGwSqiy)vYM3Eb>n1-HR!|{R2DqE=qsj$@f#aq{F{n;8}WTse76`<3gxI? zh(Ru&a;5P-bjMOy8jGGQ>^is?xMrsx7~^y9!Sz-4P>Yh7ed6n^$55omc2mT5#k>P8 xSZKdlcxcCOph8nVMdQ=aq@1yRav5cJuJ?c3=NkLB!KeL?)BOJ{{NG@K{|zt!mec?M literal 0 HcmV?d00001 diff --git a/Katteker.Test/testdata/Prism.xml b/Katteker.Test/testdata/Prism.xml new file mode 100644 index 0000000..13d72ea --- /dev/null +++ b/Katteker.Test/testdata/Prism.xml @@ -0,0 +1,1275 @@ + + + + Prism + + + + + The CompositeCommand composes one or more ICommands. + + + + + Initializes a new instance of . + + + + + Initializes a new instance of . + + Indicates when the command activity is going to be monitored. + + + + Adds a command to the collection and signs up for the event of it. + + + If this command is set to monitor command activity, and + implements the interface, this method will subscribe to its + event. + + The command to register. + + + + Removes a command from the collection and removes itself from the event of it. + + The command to unregister. + + + + Forwards to the registered commands and returns + if all of the commands return . + + Data used by the command. + If the command does not require data to be passed, this object can be set to . + + if all of the commands return ; otherwise, . + + + + Occurs when any of the registered commands raise . + + + + + Forwards to the registered commands. + + Data used by the command. + If the command does not require data to be passed, this object can be set to . + + + + + Evaluates if a command should execute. + + The command to evaluate. + A value indicating whether the command should be used + when evaluating and . + + If this command is set to monitor command activity, and + implements the interface, + this method will return if the command's + property is ; otherwise it always returns . + + + + Gets the list of all the registered commands. + + A list of registered commands. + This returns a copy of the commands subscribed to the CompositeCommand. + + + + Raises on the UI thread so every + command invoker can requery to check if the + can execute. + + + + + Handler for IsActiveChanged events of registered commands. + + The sender. + EventArgs to pass to the event. + + + + An whose delegates do not take any parameters for and . + + + + + + + Creates a new instance of with the to invoke on execution. + + The to invoke when is called. + + + + Creates a new instance of with the to invoke on execution + and a to query for determining if the command can execute. + + The to invoke when is called. + The to invoke when is called + + + + Executes the command. + + + + + Determines if the command can be executed. + + Returns if the command can execute,otherwise returns . + + + + Observes a property that implements INotifyPropertyChanged, and automatically calls DelegateCommandBase.RaiseCanExecuteChanged on property changed notifications. + + The object type containing the property specified in the expression. + The property expression. Example: ObservesProperty(() => PropertyName). + The current instance of DelegateCommand + + + + Observes a property that is used to determine if this command can execute, and if it implements INotifyPropertyChanged it will automatically call DelegateCommandBase.RaiseCanExecuteChanged on property changed notifications. + + The property expression. Example: ObservesCanExecute(() => PropertyName). + The current instance of DelegateCommand + + + + An whose delegates can be attached for and . + + + + + Creates a new instance of a , specifying both the execute action and the can execute function. + + The to execute when is invoked. + The to invoked when is invoked. + + + + Occurs when changes occur that affect whether or not the command should execute. + + + + + Raises so every + command invoker can requery . + + + + + Raises so every command invoker + can requery to check if the command can execute. + Note that this will trigger the execution of once for each invoker. + + + + + Observes a property that implements INotifyPropertyChanged, and automatically calls DelegateCommandBase.RaiseCanExecuteChanged on property changed notifications. + + The object type containing the property specified in the expression. + The property expression. Example: ObservesProperty(() => PropertyName). + + + + Gets or sets a value indicating whether the object is active. + + if the object is active; otherwise . + + + + Fired if the property changes. + + + + + This raises the event. + + + + + An whose delegates can be attached for and . + + Parameter type. + + The constructor deliberately prevents the use of value types. + Because ICommand takes an object, having a value type for T would cause unexpected behavior when CanExecute(null) is called during XAML initialization for command bindings. + Using default(T) was considered and rejected as a solution because the implementor would not be able to distinguish between a valid and defaulted values. + + Instead, callers should support a value type by using a nullable value type and checking the HasValue property before using the Value property. + + + public MyClass() + { + this.submitCommand = new DelegateCommand<int?>(this.Submit, this.CanSubmit); + } + + private bool CanSubmit(int? customerId) + { + return (customerId.HasValue && customers.Contains(customerId.Value)); + } + + + + + + + Initializes a new instance of . + + Delegate to execute when Execute is called on the command. This can be null to just hook up a CanExecute delegate. + will always return true. + + + + Initializes a new instance of . + + Delegate to execute when Execute is called on the command. This can be null to just hook up a CanExecute delegate. + Delegate to execute when CanExecute is called on the command. This can be null. + When both and ar . + + + + Executes the command and invokes the provided during construction. + + Data used by the command. + + + + Determines if the command can execute by invoked the provided during construction. + + Data used by the command to determine if it can execute. + + if this command can be executed; otherwise, . + + + + + Observes a property that implements INotifyPropertyChanged, and automatically calls DelegateCommandBase.RaiseCanExecuteChanged on property changed notifications. + + The type of the return value of the method that this delegate encapulates + The property expression. Example: ObservesProperty(() => PropertyName). + The current instance of DelegateCommand + + + + Observes a property that is used to determine if this command can execute, and if it implements INotifyPropertyChanged it will automatically call DelegateCommandBase.RaiseCanExecuteChanged on property changed notifications. + + The property expression. Example: ObservesCanExecute(() => PropertyName). + The current instance of DelegateCommand + + + + Extends to invoke the delegate in a background thread. + + + + + Creates a new instance of . + + A reference to a delegate of type . + When or are . + When the target of is not of type . + + + + Invokes the specified in an asynchronous thread by using a . + + The action to execute. + + + + Extends to invoke the delegate in a background thread. + + The type to use for the generic and types. + + + + Creates a new instance of . + + A reference to a delegate of type . + A reference to a delegate of type . + When or are . + When the target of is not of type , + or the target of is not of type . + + + + Invokes the specified in an asynchronous thread by using a . + + The action to execute. + The payload to pass while invoking it. + + + + Generic arguments class to pass to event handlers that need to receive data. + + The type of data to pass. + + + + Initializes the DataEventArgs class. + + Information related to the event. + + + + Gets the information related to the event. + + Information related to the event. + + + + Represents a reference to a that may contain a + to the target. This class is used + internally by the Prism Library. + + + + + Initializes a new instance of . + + The original to create a reference for. + If the class will create a weak reference to the delegate, allowing it to be garbage collected. Otherwise it will keep a strong reference to the target. + If the passed is not assignable to . + + + + Gets the (the target) referenced by the current object. + + if the object referenced by the current object has been garbage collected; otherwise, a reference to the referenced by the current object. + + + + Extends to invoke the delegate + in a specific . + + + + + Creates a new instance of . + + A reference to a delegate of type . + The synchronization context to use for UI thread dispatching. + When or are . + When the target of is not of type . + + + + Invokes the specified asynchronously in the specified . + + The action to execute. + + + + Extends to invoke the delegate + in a specific . + + The type to use for the generic and types. + + + + Creates a new instance of . + + A reference to a delegate of type . + A reference to a delegate of type . + The synchronization context to use for UI thread dispatching. + When or are . + When the target of is not of type , + or the target of is not of type . + + + + Invokes the specified asynchronously in the specified . + + The action to execute. + The payload to pass while invoking it. + + + + Implements . + + + + + Gets the single instance of the event managed by this EventAggregator. Multiple calls to this method with the same returns the same event instance. + + The type of event to get. This must inherit from . + A singleton instance of an event object of type . + + + + Defines a base class to publish and subscribe to events. + + + + + Allows the SynchronizationContext to be set by the EventAggregator for UI Thread Dispatching + + + + + Gets the list of current subscriptions. + + The current subscribers. + + + + Adds the specified to the subscribers' collection. + + The subscriber. + The that uniquely identifies every subscriber. + + Adds the subscription to the internal list and assigns it a new . + + + + + Calls all the execution strategies exposed by the list of . + + The arguments that will be passed to the listeners. + Before executing the strategies, this class will prune all the subscribers from the + list that return a when calling the + method. + + + + Removes the subscriber matching the . + + The returned by while subscribing to the event. + + + + Returns if there is a subscriber matching . + + The returned by while subscribing to the event. + if there is a that matches; otherwise . + + + + Provides a way to retrieve a to execute an action depending + on the value of a second filter predicate that returns true if the action should execute. + + + + + Creates a new instance of . + + A reference to a delegate of type . + When or are . + When the target of is not of type . + + + + Gets the target that is referenced by the . + + An or if the referenced target is not alive. + + + + Gets or sets a that identifies this . + + A token that identifies this . + + + + Gets the execution strategy to publish this event. + + An with the execution strategy, or if the is no longer valid. + + If is no longer valid because it was + garbage collected, this method will return . + Otherwise it will return a delegate that evaluates the and if it + returns will then call . The returned + delegate holds a hard reference to the target + delegates. As long as the returned delegate is not garbage collected, + the references delegates won't get collected either. + + + + + Invokes the specified synchronously when not overridden. + + The action to execute. + An is thrown if is null. + + + + Provides a way to retrieve a to execute an action depending + on the value of a second filter predicate that returns true if the action should execute. + + The type to use for the generic and types. + + + + Creates a new instance of . + + A reference to a delegate of type . + A reference to a delegate of type . + When or are . + When the target of is not of type , + or the target of is not of type . + + + + Gets the target that is referenced by the . + + An or if the referenced target is not alive. + + + + Gets the target that is referenced by the . + + An or if the referenced target is not alive. + + + + Gets or sets a that identifies this . + + A token that identifies this . + + + + Gets the execution strategy to publish this event. + + An with the execution strategy, or if the is no longer valid. + + If or are no longer valid because they were + garbage collected, this method will return . + Otherwise it will return a delegate that evaluates the and if it + returns will then call . The returned + delegate holds hard references to the and target + delegates. As long as the returned delegate is not garbage collected, + the and references delegates won't get collected either. + + + + + Invokes the specified synchronously when not overridden. + + The action to execute. + The payload to pass while invoking it. + An is thrown if is null. + + + + Represents a reference to a . + + + + + Gets the referenced object. + + A instance if the target is valid; otherwise . + + + + Defines an interface to get instances of an event type. + + + + + Gets an instance of an event type. + + The type of event to get. + An instance of an event object of type . + + + + Defines a contract for an event subscription to be used by . + + + + + Gets or sets a that identifies this . + + A token that identifies this . + + + + Gets the execution strategy to publish this event. + + An with the execution strategy, or if the is no longer valid. + + + + Defines a class that manages publication and subscription to events. + + + + + Subscribes a delegate to an event that will be published on the . + will maintain a to the target of the supplied delegate. + + The delegate that gets executed when the event is published. + A that uniquely identifies the added subscription. + + The PubSubEvent collection is thread-safe. + + + + + Subscribes a delegate to an event. + PubSubEvent will maintain a to the Target of the supplied delegate. + + The delegate that gets executed when the event is raised. + Specifies on which thread to receive the delegate callback. + A that uniquely identifies the added subscription. + + The PubSubEvent collection is thread-safe. + + + + + Subscribes a delegate to an event that will be published on the . + + The delegate that gets executed when the event is published. + When , the keeps a reference to the subscriber so it does not get garbage collected. + A that uniquely identifies the added subscription. + + If is set to , will maintain a to the Target of the supplied delegate. + If not using a WeakReference ( is ), the user must explicitly call Unsubscribe for the event when disposing the subscriber in order to avoid memory leaks or unexpected behavior. + + The PubSubEvent collection is thread-safe. + + + + + Subscribes a delegate to an event. + + The delegate that gets executed when the event is published. + Specifies on which thread to receive the delegate callback. + When , the keeps a reference to the subscriber so it does not get garbage collected. + A that uniquely identifies the added subscription. + + If is set to , will maintain a to the Target of the supplied delegate. + If not using a WeakReference ( is ), the user must explicitly call Unsubscribe for the event when disposing the subscriber in order to avoid memory leaks or unexpected behavior. + + The PubSubEvent collection is thread-safe. + + + + + Publishes the . + + + + + Removes the first subscriber matching from the subscribers' list. + + The used when subscribing to the event. + + + + Returns if there is a subscriber matching . + + The used when subscribing to the event. + if there is an that matches; otherwise . + + + + Defines a class that manages publication and subscription to events. + + The type of message that will be passed to the subscribers. + + + + Subscribes a delegate to an event that will be published on the . + will maintain a to the target of the supplied delegate. + + The delegate that gets executed when the event is published. + A that uniquely identifies the added subscription. + + The PubSubEvent collection is thread-safe. + + + + + Subscribes a delegate to an event. + PubSubEvent will maintain a to the Target of the supplied delegate. + + The delegate that gets executed when the event is raised. + Specifies on which thread to receive the delegate callback. + A that uniquely identifies the added subscription. + + The PubSubEvent collection is thread-safe. + + + + + Subscribes a delegate to an event that will be published on the . + + The delegate that gets executed when the event is published. + When , the keeps a reference to the subscriber so it does not get garbage collected. + A that uniquely identifies the added subscription. + + If is set to , will maintain a to the Target of the supplied delegate. + If not using a WeakReference ( is ), the user must explicitly call Unsubscribe for the event when disposing the subscriber in order to avoid memory leaks or unexpected behavior. + + The PubSubEvent collection is thread-safe. + + + + + Subscribes a delegate to an event. + + The delegate that gets executed when the event is published. + Specifies on which thread to receive the delegate callback. + When , the keeps a reference to the subscriber so it does not get garbage collected. + A that uniquely identifies the added subscription. + + If is set to , will maintain a to the Target of the supplied delegate. + If not using a WeakReference ( is ), the user must explicitly call Unsubscribe for the event when disposing the subscriber in order to avoid memory leaks or unexpected behavior. + + The PubSubEvent collection is thread-safe. + + + + + Subscribes a delegate to an event. + + The delegate that gets executed when the event is published. + Specifies on which thread to receive the delegate callback. + When , the keeps a reference to the subscriber so it does not get garbage collected. + Filter to evaluate if the subscriber should receive the event. + A that uniquely identifies the added subscription. + + If is set to , will maintain a to the Target of the supplied delegate. + If not using a WeakReference ( is ), the user must explicitly call Unsubscribe for the event when disposing the subscriber in order to avoid memory leaks or unexpected behavior. + + The PubSubEvent collection is thread-safe. + + + + + Publishes the . + + Message to pass to the subscribers. + + + + Removes the first subscriber matching from the subscribers' list. + + The used when subscribing to the event. + + + + Returns if there is a subscriber matching . + + The used when subscribing to the event. + if there is an that matches; otherwise . + + + + Subscription token returned from on subscribe. + + + + + Initializes a new instance of . + + + + + Indicates whether the current object is equal to another object of the same type. + + + if the current object is equal to the parameter; otherwise, . + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + + true if the specified is equal to the current ; otherwise, false. + + The to compare with the current . + The parameter is null.2 + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + 2 + + + + Disposes the SubscriptionToken, removing the subscription from the corresponding . + + + + + Specifies on which thread a subscriber will be called. + + + + + The call is done on the same thread on which the was published. + + + + + The call is done on the UI thread. + + + + + The call is done asynchronously on a background thread. + + + + + Interface that defines if the object instance is active + and notifies when the activity changes. + + + + + Gets or sets a value indicating whether the object is active. + + if the object is active; otherwise . + + + + Notifies that the value for property has changed. + + + + + Defines values for the categories used by . + + + + + Debug category. + + + + + Exception category. + + + + + Informational category. + + + + + Warning category. + + + + + Implementation of that logs into a message into the Debug.Listeners collection. + + + + + Write a new log entry with the specified category and priority. + + Message body to log. + Category of the entry. + The priority of the entry. + + + + Implementation of that does nothing. This + implementation is useful when the application does not need logging + but there are infrastructure pieces that assume there is a logger. + + + + + This method does nothing. + + Message body to log. + Category of the entry. + The priority of the entry. + + + + Defines a simple logger façade to be used by the Prism Library. + + + + + Write a new log entry with the specified category and priority. + + Message body to log. + Category of the entry. + The priority of the entry. + + + + Defines values for the priorities used by . + + + + + No priority specified. + + + + + High priority entry. + + + + + Medium priority entry. + + + + + Low priority entry. + + + + + Implementation of to simplify models. + + + + + Occurs when a property value changes. + + + + + Checks if a property already matches a desired value. Sets the property and + notifies listeners only when necessary. + + Type of the property. + Reference to a property with both getter and setter. + Desired value for the property. + Name of the property used to notify listeners. This + value is optional and can be provided automatically when invoked from compilers that + support CallerMemberName. + True if the value was changed, false if the existing value matched the + desired value. + + + + Checks if a property already matches a desired value. Sets the property and + notifies listeners only when necessary. + + Type of the property. + Reference to a property with both getter and setter. + Desired value for the property. + Name of the property used to notify listeners. This + value is optional and can be provided automatically when invoked from compilers that + support CallerMemberName. + Action that is called after the property value has been changed. + True if the value was changed, false if the existing value matched the + desired value. + + + + Raises this object's PropertyChanged event. + + Name of the property used to notify listeners. This + value is optional and can be provided automatically when invoked from compilers + that support . + + + + Notifies listeners that a property value has changed. + + Name of the property used to notify listeners. This + value is optional and can be provided automatically when invoked from compilers + that support . + + + + Raises this object's PropertyChanged event. + + The PropertyChangedEventArgs + + + + Raises this object's PropertyChanged event. + + The type of the property that has a new value + A Lambda expression representing the property that has a new value. + + + + Manages validation errors for an object, notifying when the error state changes. + + The type of the error object. + + + + Initializes a new instance of the class. + + The action that invoked if when errors are added for an object./> + event. + + + + Gets a value indicating whether the object has validation errors. + + + + + Gets the validation errors for a specified property. + + The name of the property. + The validation errors of type for the property. + + + + Clears the errors for the property indicated by the property expression. + + The property type. + The expression indicating a property. + + container.ClearErrors(()=>SomeProperty); + + + + + Clears the errors for a property. + + The name of th property for which to clear errors. + + container.ClearErrors("SomeProperty"); + + + + + Sets the validation errors for the specified property. + + The property type for which to set errors. + The indicating the property. + The list of errors to set for the property. + + + + Sets the validation errors for the specified property. + + + If a change is detected then the errors changed event is raised. + + The name of the property. + The new validation errors. + + + + Provides support for extracting property information based on a property expression. + + + + + Extracts the property name from a property expression. + + The object type containing the property specified in the expression. + The property expression (e.g. p => p.PropertyName) + The name of the property. + Thrown if the is null. + Thrown when the expression is:
+ Not a
+ The does not represent a property.
+ Or, the property is static. +
+
+ + + Extracts the property name from a LambdaExpression. + + The LambdaExpression + The name of the property. + Thrown if the is null. + Thrown when the expression is:
+ The does not represent a property.
+ Or, the property is static. +
+
+ + + The ViewModelLocationProvider class locates the view model for the view that has the AutoWireViewModelChanged attached property set to true. + The view model will be located and injected into the view's DataContext. To locate the view, two strategies are used: First the ViewModelLocationProvider + will look to see if there is a view model factory registered for that view, if not it will try to infer the view model using a convention based approach. + This class also provide methods for registering the view model factories, + and also to override the default view model factory and the default view type to view model type resolver. + + + + + A dictionary that contains all the registered factories for the views. + + + + + A dictionary that contains all the registered ViewModel types for the views. + + + + + The default view model factory which provides the ViewModel type as a parameter. + + + + + ViewModelfactory that provides the View instance and ViewModel type as parameters. + + + + + Default view type to view model type resolver, assumes the view model is in same assembly as the view type, but in the "ViewModels" namespace. + + + + + Sets the default view model factory. + + The view model factory which provides the ViewModel type as a parameter. + + + + Sets the default view model factory. + + The view model factory that provides the View instance and ViewModel type as parameters. + + + + Sets the default view type to view model type resolver. + + The view type to view model type resolver. + + + + Automatically looks up the viewmodel that corresponds to the current view, using two strategies: + It first looks to see if there is a mapping registered for that view, if not it will fallback to the convention based approach. + + The dependency object, typically a view. + The call back to use to create the binding between the View and ViewModel + + + + Gets the view model for the specified view. + + The view that the view model wants. + The ViewModel that corresponds to the view passed as a parameter. + + + + Gets the ViewModel type for the specified view. + + The View that the ViewModel wants. + The ViewModel type that corresponds to the View. + + + + Registers the ViewModel factory for the specified view type. + + The View + The ViewModel factory. + + + + Registers the ViewModel factory for the specified view type name. + + The name of the view type. + The ViewModel factory. + + + + Registers a ViewModel type for the specified view type. + + The View + The ViewModel + + + + Registers a ViewModel type for the specified view. + + The View type name + The ViewModel type + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Cannot register a CompositeCommand in itself.. + + + + + Looks up a localized string similar to Cannot register the same command twice in the same CompositeCommand.. + + + + + Looks up a localized string similar to {1}: {2}. Priority: {3}. Timestamp:{0:u}.. + + + + + Looks up a localized string similar to Neither the executeMethod nor the canExecuteMethod delegates can be null.. + + + + + Looks up a localized string similar to T for DelegateCommand<T> is not an object nor Nullable.. + + + + + Looks up a localized string similar to To use the UIThread option for subscribing, the EventAggregator must be constructed on the UI thread.. + + + + + Looks up a localized string similar to Invalid Delegate Reference Type Exception. + + + + + Looks up a localized string similar to The entity does not contain a property with that name. + + + + + Looks up a localized string similar to The member access expression does not access a property.. + + + + + Looks up a localized string similar to The expression is not a member access expression.. + + + + + Looks up a localized string similar to The referenced property is a static property.. + + +
+
diff --git a/Katteker.Test/testdata/System.Windows.Interactivity.dll b/Katteker.Test/testdata/System.Windows.Interactivity.dll new file mode 100644 index 0000000000000000000000000000000000000000..931c744c87a5bafbfa9471ee90b082c752b12dfc GIT binary patch literal 55904 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 icF~$l7!ZGY?^C + + + + + diff --git a/Katteker/KattekerConfig.cs b/Katteker/KattekerConfig.cs index 9f86454..19f7147 100644 --- a/Katteker/KattekerConfig.cs +++ b/Katteker/KattekerConfig.cs @@ -1,25 +1,23 @@ -using System.IO; -using System.Runtime.Serialization; -using System.Runtime.Serialization.Json; +using System; +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; namespace Katteker { /// /// Configuration of a Katteker-Deployment /// - [DataContract] + [Serializable] public class KattekerConfig { /// /// Publish path /// - [DataMember] public string Publish { get; set; } /// /// Name of the changelog file. /// - [DataMember] public string Changelog { get; set; } /// @@ -31,10 +29,10 @@ namespace Katteker public static KattekerConfig ReadFromFile(string path) { if (!File.Exists(path)) throw new FileNotFoundException(); - var dataContractJsonSerializer = new DataContractJsonSerializer(typeof(KattekerConfig)); + var serializer = new BinaryFormatter(); using (var fileStream = File.OpenRead(path)) { - var obj = dataContractJsonSerializer.ReadObject(fileStream); + var obj = serializer.Deserialize(fileStream); return (KattekerConfig)obj; } } @@ -48,8 +46,8 @@ namespace Katteker if (File.Exists(path)) File.Delete(path); using (var fileStream = File.OpenWrite(path)) { - var dataContractJsonSerializer = new DataContractJsonSerializer(typeof(KattekerConfig)); - dataContractJsonSerializer.WriteObject(fileStream, this); + var serializer = new BinaryFormatter(); + serializer.Serialize(fileStream, this); } } } diff --git a/Katteker/UpdateManager.cs b/Katteker/UpdateManager.cs index 18d2963..43795e6 100644 --- a/Katteker/UpdateManager.cs +++ b/Katteker/UpdateManager.cs @@ -101,12 +101,10 @@ namespace Katteker { exeToStart = exeToStart ?? Path.GetFileName(Assembly.GetEntryAssembly().Location); var program = Path.Combine(_rootAppDirectory, exeToStart); - if (File.Exists(program)) - { - Process.Start(program, arguments); - Thread.Sleep(500); - Environment.Exit(0); - } + if (!File.Exists(program)) throw new FileNotFoundException(program); + Process.Start(program, arguments); + Thread.Sleep(500); + Environment.Exit(0); } /// diff --git a/Katteker/Utility.cs b/Katteker/Utility.cs index 1b8f16a..0fad675 100644 --- a/Katteker/Utility.cs +++ b/Katteker/Utility.cs @@ -12,7 +12,7 @@ namespace Katteker { internal static string GetLocalAppDataDirectory() { - return Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); + return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Programs"); } internal static string GetApplicationName(Assembly assembly = null) => (assembly ?? Assembly.GetEntryAssembly()).GetName().Name;