Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Ninject,根据循环变量选择一个类_C#_Ninject - Fatal编程技术网

C# Ninject,根据循环变量选择一个类

C# Ninject,根据循环变量选择一个类,c#,ninject,C#,Ninject,Visual Studio 2010,C#,Ninject版本3.0.0.0 有一个循环提供一个字符串变量X。类中有一个对Ninject的引用。在循环内部,变量在内核中使用。Get方法选择要使用的类 我的印象是,Ninject能够在不必使用Ninject内核.Get方法的情况下确定合适的类。这只是另一个依赖项,Ninject应该帮助避免这种情况 是否有任何方法可以配置Ninject来根据变量X确定要使用的正确类,而不使用kernel.Get?我希望在课堂上不使用Ninject引用就可以完成这项任

Visual Studio 2010,C#,Ninject版本3.0.0.0

有一个循环提供一个字符串变量X。类中有一个对Ninject的引用。在循环内部,变量在内核中使用。Get方法选择要使用的类

我的印象是,Ninject能够在不必使用Ninject内核.Get方法的情况下确定合适的类。这只是另一个依赖项,Ninject应该帮助避免这种情况

是否有任何方法可以配置Ninject来根据变量X确定要使用的正确类,而不使用kernel.Get?我希望在课堂上不使用Ninject引用就可以完成这项任务

我已经在网上搜索了这个问题的答案。我可能错过了什么或是误解了什么,但我已经花了很多时间去寻找

谢谢

好的,有几个类使用这种技术。这里有一个:

守则:

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就像使用字典一样,但代码中已经有了字典:
classNames

与其将
Named
添加到
icomparatenanddata
的绑定中,不如将“name”数据添加到
icomparatenanddata
接口(作为属性),并将所有
icomparatenanddata
注入
igetlassnamefrompatternType
--(当然,您应该更改名称,然后b/c它提供不同的功能。我已将其重命名为
IPatternDictionary

而不是:

   classNames.TryGetValue(matchMode, out className);
   IComparePatternAndData patternMatcher = kernel.Get<IComparePatternAndData>(className);
classNames.TryGetValue(matchMode,out className);
IComparePatternAndData patternMatcher=kernel.Get(className);

您犯了多个模式错误。首先,您使用的是服务定位器反模式。其次,您应该对接口而不是实现进行编码,否则依赖项注入毫无价值。最后,您应该将任何必需的依赖项注入到类中,以便循环可以使用它。这也是值得的我认为处理这些抽象问题不是一个很好的问题。如果你能提供你的代码就最好了。给我们看看你有什么好吗?我总结了代码,因为有很多。我会看看我能做些什么来提供示例。我在使用接口,这就是我连接Ninject的方式。我可以做得很好这是我第一次使用C#,第一次用于面向对象编程,第一次用于Ninject。你的解决方案太棒了。我在发布的代码中使用了它,只是将int标识符更改为?、*、+、和#的字符串。就我而言,你是一个Ninject之神anks.@DarkHandle很好,谢谢你的表扬,尽管我相信有相当多的人比我更了解ninject。另一方面,如果你能的话,那就太好了。谢谢:)对不起,这是我第一次问关于SE的问题。我显然没有足够的东西来支持你的解决方案。但我确实接受了答案。再次感谢。
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;
    }
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);