2

私は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;
}

このようにコンクリートをインターフェースに密結合させたくありません。LINQ to Objects またはオブジェクト初期化子で Ninject を使用することに関する情報を見つけることができませんでした。私は間違った場所を探しているかもしれませんが、まったく運がない日を探しています。

カーネルをシングルトン インスタンスに入れ、それが機能するかどうかを確認することを考えていましたが、うまくいくかどうかはわかりません。また、カーネルを渡すのは悪いことだと聞いています。現在、これをクラス ライブラリに実装しようとしています。これが不可能な場合、この場合のベストプラクティスについて、誰かが例や提案を持っていますか? 助けてくれてありがとう。

編集: いくつかの回答に基づいて、明確にする必要があると感じています。はい、上記の例は短命に見えますが、それは単に私がやろうとしていた 1 つの作品の例にすぎません。より大きな図を見てみましょう。XML の代わりに、サードパーティの Web サービスを介してすべてのデータを収集し、そのためのインターフェイスを作成しているとします。データは、wsdl で定義されたオブジェクトである場合もあれば、xml 文字列である場合もあります。IPerson は、Person オブジェクトと User オブジェクトの両方に使用できます。移植可能である必要があり、他のプロジェクトで使用され、MVC3 Web アプリケーションに渡され、オブジェクトが JavaScript でも使用されるため、別のクラス ライブラリ内でこれを行います。これまでのすべての入力に感謝します。

4

4 に答える 4

3

Personクラスは短命のオブジェクトであり、依存性注入に使用するのには適していません。これ以外に、動作は含まれておらず、単なる POCO (プレーンな古い CLR オブジェクト) です。POCO は抽象化する価値のあるものに依存しないため、通常、POCO を抽象化する理由はありません。言い換えれば、与えられた例で。IPersonインターフェイスは必要ありません。Personアプリケーション全体でクラスを直接操作できます。

ただし、このGetPeopleメソッドは通常、DI 構成を使用して抽象化するサービスの一部である可能性があります。ただし、メソッドを含むサービス インターフェイスはGetPeople(string xml)、おそらく間違った抽象化です。これは、常に xml 文字列を提供することを意味するためです。この XML 文字列がある場合、その XML 文字列を他の方法で解析する理由はありますか? IPersonRepositoryメソッドとのインターフェースを持つ方が便利でしょうGetAllPeople()。特定の実装XmlPersonRepositoryは、XML データ ソースを使用して人々を取得する (ディスク、データベース、または誰が何を知っているか) である可能性があります。

于 2011-03-06T10:59:38.613 に答える
2

IPersonインターフェースの実装が複数ありますか? (それは単に渡されるデータオブジェクトのように見えるので、私はそれを疑っていPersonます。)おそらく私はあなたの質問の要点を見逃していますが、DIは懸念を分離し、インターフェース設計から実装を抽象化するためのものです。

Person定義された XML スキーマからオブジェクトを抽出するのに DI がどのように役立つのかわかりません。実装を動的に注入するのではなく、データを解析しています。おそらく、パフォーマンスを比較するために XML を別の方法で解析したい場合は、を含むクラスの代替実装を作成しますがGetPeople、それはあなたの質問のポイントとは思えません。

于 2011-03-05T17:11:31.330 に答える
1

Ninject ができることは、IPerson の実装を取得することだけです。XML やその他の構造は解析されません。実際、ninject カーネルまたはサービス ロケータを経由する必要があるため、オブジェクトの初期化構文が失われる可能性が高くなります。

あなたがやりたいことのためにシリアライゼーションライブラリをお勧めします。json.net または.NET のビルトイン XML シリアル化をお勧めします

于 2011-03-05T21:27:24.813 に答える
0

通常、ここに 20,000 人以上の担当者がいる人は、おそらくこの件について私よりも多くのことを知っていると思います。ただし、次のようにも思えます。

1)あなたの例は、Ninject Webサイトで使用されている例からそれほど離れていません
2)「この」特定の例が良いものではない場合でも、目前の問題はオブジェクト初期化子を使用しており、それは他の多くの例に適用できます正当なシナリオ。

残念ながら、Ninject でオブジェクトの初期化を行う方法についての答えはありませんが、Ninject を「どこで」使用するのに役立つかについての提案があります (この投稿は 1 年前のものですが、おそらくこれは誰かを助けるでしょう)。 .

GetPeople() メソッドで具体的なクラスを使用する必要がある可能性が高いことに同意します。そのメソッドは、おそらく Person に固有の実装の一部である (同じアセンブリおよび/または名前空間にある可能性が高いため)。ただし、個人に関する情報をユーザーに提示するフォームのようなものがある場合は、具体的な実装ではなく、IPerson で動作するはずです。

linq を利用するためにオブジェクト初期化子を主に使用する必要がある場所は、具象クラスを操作する必要がある GetPeople などのメソッドであるため、両方の長所を活用できるはずです。いいえ、IPerson を使用する場合、フォームでオブジェクト初期化子を使用することはできませんが、フォームで linq を使用する場合に必要な方法で「必要」になるとは思いません。 GetPeople メソッド。

編集:実際には、ここでlinqを使用するためにオブジェクト初期化子を「必要」としません

構文糖衣を忘れれば、書き直すことができます

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();

そして、インジェクションで動作するように変更する方法が非常に簡単であることがわかります。

于 2012-02-21T03:59:00.147 に答える