1

通常、私はこれを行います:

public class DBFactory
{
        public UserDAO GetUserDao()
        {
               return new UserDao();     
        }

}

UserDao は IUserDao の具体的な実装です。

だから今、私のコードは散らばっています:

DBFactory factory = new DBFactory();

IUserDao userDao = factory.GetUserDao();

User user = userDao.GetById(1);

実装を交換したい場合は、DBFactory に移動し、別の実装を呼び出すようにコードを変更する必要があります。

NINject を使用する場合、アプリケーションの起動時または構成ファイルを介して特定の実装をバインドします。(または特定のパラメータなどに基づいてバインドします)。

それだけですか?それとももっとありますか?

(ここでどのように役立つかを知りたいかどうかを尋ねている理由:注文マネージャークラスの設計を支援する)

4

2 に答える 2

2

一言で言えば、そうです。その後、コードの構造が変更されるため、依存関係はコンストラクター (または個人的には好きではないセッター) を介して渡されます。メソッドの本文で、サービスに対して「new XXX()」と言う必要はなくなりました。

また、DI フレームワークはファクトリとして機能できるため、ファクトリがまったく必要なくなる可能性もあります。おそらく、IUserDAO に対するコンストラクターの依存関係が必要になるだけです。

次のようなものです:

public class ClassThatNeedsUserDAO
{
     private readonly IUserDAO _userDAO;
     public ClassThatNeedsUserDAO(IUserDAO userDAO)
     {
         _userDAO = userDAO;
     }

     public User MyMethod(userId)
     {
         return _userDAO.GetById(int userId);
     }     
}
于 2009-12-18T20:46:37.937 に答える
1

それだけではありません。1 つの例として、UserDao のコンストラクターが他のオブジェクトを引数 (依存関係) として渡す必要がある場合があります。

これらのオブジェクトを ninject で自動的に作成して注入することで、コードを数行節約できますが、さらに重要なことは、すべてのクラスがその依存関係と疎結合されていることを確認することです。

于 2009-12-18T20:47:36.497 に答える