Ninject, select一个基于循环变量的class
Ninject, select a class based on a loop variable
Visual Studio 2010,C#,Ninject 版本 3.0.0.0。
有一个提供字符串变量 X 的循环。在 class 中有对 Ninject 的引用。在循环内部,变量是在一个kernel.Get方法中使用到select到class来使用的。
我的印象是 Ninject 无需使用 Ninject kernel.Get 方法就能确定正确的 class。这只是另一种依赖性,Ninject 应该有助于避免这种情况。
有什么方法可以配置 Ninject 以根据变量 X 确定要使用的正确 class 而无需使用 kernel.Get?我想在 class.
中不使用 Ninject 引用来完成此操作
我在 Whosebug 和 net general 上搜索了这个问题的答案。我可能遗漏了某些东西或误解了某些东西,但我已经花了很多时间进行搜索。
谢谢。
好的,有几个 class 使用这种技术。这是一个:
代码:
foreach (string nodePattern in patternList.GetPattern())
{
numberOfPatterns++;
tempReturn = true;
nodeStack.LoadbatchStructs(nodeStructure);
patternStack.LoadPattern(nodePattern);
PatternProperty patternProp = patternStack.PopPattern();
while (!(patternProp.Identifier == "EndOfStack"))
{
matchMode = int.TryParse(patternProp.PatternType, out outIntTestResult)
? "#"
: patternProp.PatternType;
int.TryParse(patternProp.PatternType, out loopCount);
classNames.TryGetValue(matchMode, out className);
IComparePatternAndData patternMatcher = kernel.Get<IComparePatternAndData>(className);
tempReturn &= patternMatcher.MatchesPattern(nodeStack, patternProp.Identifier, loopCount);
if (tempReturn == false)
{
falseMatches++;
break;
}
else
{
patternProp = patternStack.PopPattern();
//If there are no more pattern units to match, but there are more node identifiers (e.g. form identifiers or template IDs),
//then the pattern didn't match. So set the tempReturn to false.
if (patternProp.Identifier == "EndOfStack" &&
!(nodeStack.PeekStructData() == "ENDNODE"))
{
tempReturn = false;
}
}
} //Next unit of pattern string
if (tempReturn == true) numberOfMatches++;
} // Next pattern string
if (numberOfMatches > 0)
{
tempReturn = true;
}
else
{
tempReturn = false;
}
return tempReturn;
Ninject 绑定。
Bind<IComparePatternAndData>().To<DataMatchesPatternCount>().Named("DataMatchesPatternCount");
Bind<IComparePatternAndData>().To<DataMatchesPatternErotem>().Named("DataMatchesPatternErotem");
Bind<IComparePatternAndData>().To<DataMatchesPatternStar>().Named("DataMatchesPatternStar");
Bind<IComparePatternAndData>().To<DataMatchesPatternPlus>().Named("DataMatchesPatternPlus");
class构造函数:
public class ValidateNodeStructure : IValidateNodeStructure
{
private readonly INodeStructure nodeStruct;
private readonly BatchStructStack nodeStack;
private INodePattern patternList;
private readonly IPatternStack patternStack;
private readonly IGetClassNameFromPatternType getClassNames;
public ValidateNodeStructure(INodeStructure nodeStructure, BatchStructStack nodeStack, IPatternStack patternStack, IGetClassNameFromPatternType getClassNames)
{
this.nodeStruct = nodeStructure;
this.nodeStack = nodeStack;
this.patternStack = patternStack;
this.getClassNames = getClassNames;
}
您正在像使用字典一样使用 ninject,但您的代码中已经有了字典:classNames
。
为什么不将 Named
添加到 IComparePatternAndData
的绑定中,为什么不将 "name" 数据添加到 IComparePatternAndData
接口(作为 属性) 并将所有 IComparePatternAndData
注入 IGetClassNameFromPatternType
--(当然你应该更改名称然后 b/c 它提供不同的功能。我已将其重命名为 IPatternDictionary
) .
public interface IComparePatternAndData
{
int PatternId { get; }
// of course the actual compare method(s) go here as well...
}
public interface IPatternDictionary
{
bool TryGetValue(int key, out IComparePatternAndData value);
}
public class PatternDictionary : Dictionary<int, IComparePatternAndData>, IPatternDictionary
{
public PatternDictionary(IComparePatternAndData[] patterns)
{
foreach (IComparePatternAndData pattern in patterns)
{
this[pattern.PatternId] = pattern;
}
}
}
绑定:
Bind<IPatternDictionary>().To<PatternDictionary>();
Bind<IComparePatternAndData>().To<DataMatchesPatternCount>();
Bind<IComparePatternAndData>().To<DataMatchesPatternErotem>();
Bind<IComparePatternAndData>().To<DataMatchesPatternStar>();
Bind<IComparePatternAndData>().To<DataMatchesPatternPlus>();
用法:
IComparePatternAndData patternMatcher;
patternDictionary.TryGetValue(matchMode, out patternMatcher);
而不是:
classNames.TryGetValue(matchMode, out className);
IComparePatternAndData patternMatcher = kernel.Get<IComparePatternAndData>(className);
Visual Studio 2010,C#,Ninject 版本 3.0.0.0。
有一个提供字符串变量 X 的循环。在 class 中有对 Ninject 的引用。在循环内部,变量是在一个kernel.Get方法中使用到select到class来使用的。
我的印象是 Ninject 无需使用 Ninject kernel.Get 方法就能确定正确的 class。这只是另一种依赖性,Ninject 应该有助于避免这种情况。
有什么方法可以配置 Ninject 以根据变量 X 确定要使用的正确 class 而无需使用 kernel.Get?我想在 class.
中不使用 Ninject 引用来完成此操作我在 Whosebug 和 net general 上搜索了这个问题的答案。我可能遗漏了某些东西或误解了某些东西,但我已经花了很多时间进行搜索。
谢谢。
好的,有几个 class 使用这种技术。这是一个:
代码:
foreach (string nodePattern in patternList.GetPattern())
{
numberOfPatterns++;
tempReturn = true;
nodeStack.LoadbatchStructs(nodeStructure);
patternStack.LoadPattern(nodePattern);
PatternProperty patternProp = patternStack.PopPattern();
while (!(patternProp.Identifier == "EndOfStack"))
{
matchMode = int.TryParse(patternProp.PatternType, out outIntTestResult)
? "#"
: patternProp.PatternType;
int.TryParse(patternProp.PatternType, out loopCount);
classNames.TryGetValue(matchMode, out className);
IComparePatternAndData patternMatcher = kernel.Get<IComparePatternAndData>(className);
tempReturn &= patternMatcher.MatchesPattern(nodeStack, patternProp.Identifier, loopCount);
if (tempReturn == false)
{
falseMatches++;
break;
}
else
{
patternProp = patternStack.PopPattern();
//If there are no more pattern units to match, but there are more node identifiers (e.g. form identifiers or template IDs),
//then the pattern didn't match. So set the tempReturn to false.
if (patternProp.Identifier == "EndOfStack" &&
!(nodeStack.PeekStructData() == "ENDNODE"))
{
tempReturn = false;
}
}
} //Next unit of pattern string
if (tempReturn == true) numberOfMatches++;
} // Next pattern string
if (numberOfMatches > 0)
{
tempReturn = true;
}
else
{
tempReturn = false;
}
return tempReturn;
Ninject 绑定。
Bind<IComparePatternAndData>().To<DataMatchesPatternCount>().Named("DataMatchesPatternCount");
Bind<IComparePatternAndData>().To<DataMatchesPatternErotem>().Named("DataMatchesPatternErotem");
Bind<IComparePatternAndData>().To<DataMatchesPatternStar>().Named("DataMatchesPatternStar");
Bind<IComparePatternAndData>().To<DataMatchesPatternPlus>().Named("DataMatchesPatternPlus");
class构造函数:
public class ValidateNodeStructure : IValidateNodeStructure
{
private readonly INodeStructure nodeStruct;
private readonly BatchStructStack nodeStack;
private INodePattern patternList;
private readonly IPatternStack patternStack;
private readonly IGetClassNameFromPatternType getClassNames;
public ValidateNodeStructure(INodeStructure nodeStructure, BatchStructStack nodeStack, IPatternStack patternStack, IGetClassNameFromPatternType getClassNames)
{
this.nodeStruct = nodeStructure;
this.nodeStack = nodeStack;
this.patternStack = patternStack;
this.getClassNames = getClassNames;
}
您正在像使用字典一样使用 ninject,但您的代码中已经有了字典:classNames
。
为什么不将 Named
添加到 IComparePatternAndData
的绑定中,为什么不将 "name" 数据添加到 IComparePatternAndData
接口(作为 属性) 并将所有 IComparePatternAndData
注入 IGetClassNameFromPatternType
--(当然你应该更改名称然后 b/c 它提供不同的功能。我已将其重命名为 IPatternDictionary
) .
public interface IComparePatternAndData
{
int PatternId { get; }
// of course the actual compare method(s) go here as well...
}
public interface IPatternDictionary
{
bool TryGetValue(int key, out IComparePatternAndData value);
}
public class PatternDictionary : Dictionary<int, IComparePatternAndData>, IPatternDictionary
{
public PatternDictionary(IComparePatternAndData[] patterns)
{
foreach (IComparePatternAndData pattern in patterns)
{
this[pattern.PatternId] = pattern;
}
}
}
绑定:
Bind<IPatternDictionary>().To<PatternDictionary>();
Bind<IComparePatternAndData>().To<DataMatchesPatternCount>();
Bind<IComparePatternAndData>().To<DataMatchesPatternErotem>();
Bind<IComparePatternAndData>().To<DataMatchesPatternStar>();
Bind<IComparePatternAndData>().To<DataMatchesPatternPlus>();
用法:
IComparePatternAndData patternMatcher;
patternDictionary.TryGetValue(matchMode, out patternMatcher);
而不是:
classNames.TryGetValue(matchMode, out className);
IComparePatternAndData patternMatcher = kernel.Get<IComparePatternAndData>(className);