Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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# 具有对象初始值设定项和LINQ的Ninject_C#_Linq_Dependency Injection_Ninject_Object Initializers - Fatal编程技术网

C# 具有对象初始值设定项和LINQ的Ninject

C# 具有对象初始值设定项和LINQ的Ninject,c#,linq,dependency-injection,ninject,object-initializers,C#,Linq,Dependency Injection,Ninject,Object Initializers,我是Ninject的新手,所以我所尝试的可能根本不可能,但我想问一下。我在下面随意填写,所以可能会有打字错误。假设我有一个界面: public interface IPerson { string FirstName { get; set; } string LastName { get; set;} string GetFullName(); } 和混凝土: public class Person : IPerson { public string Firs

我是Ninject的新手,所以我所尝试的可能根本不可能,但我想问一下。我在下面随意填写,所以可能会有打字错误。假设我有一个界面:

public interface IPerson
{
    string FirstName { get; set; }
    string LastName { get; set;}

    string GetFullName();
}
和混凝土:

public class Person : IPerson
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public string GetFullName()
    {
        return String.Concat(FirstName, " ", LastName);
    }
}
当我从数组或xml检索数据时,我习惯于这样做:

public IEnumerable<IPerson> GetPeople(string xml)
{
    XElement persons = XElement.Parse(xml);

    IEnumerable<IPerson> people = (
        from person in persons.Descendants("person")
        select new Person
        {
            FirstName = person.Attribute("FName").Value,
            LastName = person.Attribute("LName").Value
        }).ToList();

    return people;
}
public IEnumerable GetPeople(字符串xml)
{
XElement persons=XElement.Parse(xml);
i人数=(
从人到人。后代(“人”)
选择新人
{
FirstName=person.Attribute(“FName”).Value,
LastName=person.Attribute(“LName”).Value
}).ToList();
还人,;
}
我不想以这种方式将混凝土与界面紧密结合。我还没有找到任何关于将Ninject与LINQ to对象或对象初始值设定项一起使用的信息。我可能找错地方了,但我已经找了一天没有运气了

我曾考虑将内核放在一个单例实例中,看看它是否能工作,但我不确定它是否能工作,而且我听说传递内核是一件坏事。我目前正试图在类库中实现这一点。如果这是不可能的,是否有人有任何关于这种情况下最佳实践的例子或建议?提前谢谢你的帮助

编辑:
根据一些答案,我觉得我应该澄清一下。是的,上面的例子看起来很短暂,但它只是我试图做的一件事的一个例子。让我们从更大的角度来看。假设我不是通过XML而是通过第三方web服务收集所有数据,并为其创建接口,数据可以是wsdl中定义的对象,有时也可以是XML字符串。IPerson可用于Person对象和User对象。我将在一个单独的类库中完成这项工作,因为它需要可移植,并将用于其他项目,然后将其交给MVC3 Web应用程序,对象也将在javascript中使用。我非常感谢迄今为止的所有投入。

您的
IPerson
接口是否有多个实现?(我对此表示怀疑,因为似乎
Person
只是一个传递的数据对象。)也许我没有抓住你问题的重点,但DI是用于分离关注点和抽象接口设计的实现


我不知道DI如何帮助您从定义的XML模式中提取
Person
对象。您正在解析数据,而不是动态注入实现。如果您想以不同的方式解析XML来比较性能,您可能会创建包含
GetPeople
的类的替代实现,但我不认为这是您问题的重点

Ninject能为您做的就是为您实现IPerson。它不会解析XML或其他结构。事实上,您很可能会丢失对象初始化语法,因为您必须通过ninject内核或服务定位器


我建议为您想要做的事情创建一个序列化库。我建议您使用json.net或

您的
Person
类是一个短暂的对象,它本身不适合用于依赖项注入。除此之外,它不包含任何行为,只是一个POCO(普通的旧CLR对象)。因为POCO不依赖于任何值得抽象的东西,所以通常没有理由抽象它们。换言之:使用给定的示例。您不需要
IPerson
接口。您可以在整个应用程序中直接使用
Person


然而,
GetPeople
方法通常可以是使用DI配置抽象掉的服务的一部分。但是,包含
GetPeople(stringxml)
方法的服务接口可能是一个错误的抽象,因为这意味着您将始终提供一个xml字符串。当您拥有这个XML字符串时,是否有任何理由以任何其他方式解析该XML字符串?使用带有
GetAllPeople()
方法的
IPersonRepository
接口会更方便。一个给定的实现可以是
XmlPersonRepository
,它使用XML数据源(从磁盘、数据库或谁知道是什么)来获取人员。

通常,我会简单地假设这里有20k+代表的人可能比我更了解这些东西。然而,在我看来:

1) 您的示例与Ninject网站上使用的示例相差不远
2) 即使“这个”特定的示例不是一个好的示例,但当前的问题是使用对象初始值设定项,这可能适用于任何其他数量的更合法的场景

不幸的是,我没有关于如何使用Ninject进行对象初始化的答案,但我确实有一个关于“在哪里”使用Ninject的建议,这可能会有所帮助(我意识到这篇文章已经有一年了,但这可能会帮助一些人)

我同意您最有可能使用GetPeople()方法中的具体类,因为该方法可能是特定于Person的实现的一部分(并且可能位于同一程序集和/或命名空间中)。但是,当您有一个表单之类的东西向用户呈现关于某人的信息时,我认为它应该与IPerson一起工作,而不是具体的实现

为了充分利用linq,您主要需要使用对象初始值设定项的地方是在诸如GetPeople之类的方法中,您应该在其中使用具体的类,尽管如此,我相信您应该能够做到两全其美。不,在使用IPerson时,您不能在表单中使用对象初始值设定项,但我认为您永远不需要这样做
IEnumerable<IPerson> people = ( 
    from person in persons.Descendants("person") 
    select new Person 
    { 
        FirstName = person.Attribute("FName").Value, 
        LastName = person.Attribute("LName").Value 
    }).ToList(); 
IEnumerable<IPerson> people = 
    (persons.Descendants("person")
           .Select(o => 
           { 
               var p = new Person();
               p.FirstName = person.Attribute("FName").Value;
               p.LastName = person.Attribute("LName").Value;
               return p;
           }).ToList();