1

私は以前、次のようなコードを持つコントローラーを持っていました。

public ActionResult Method(int Id)
        {
            var foo = doThis(Id)
            return View("Error");
        }

doThis()は、コントローラーに存在するメソッドであり、いくつかのロジックを実行します。現在、すべてのビジネスロジックを多数のクラスを含むサービスプロジェクトに再配置しようとしています。

まず、クラスライブラリProject.Servicesを追加してから、以下を含むクラスFooServicesを追加しました。

namespace Project.Services
{
    class FooServices
    {
        public List<Bar> doThis(int Id)
        {
            //Do stuff
            return parentSets;
        }
    }
}

MVCプロジェクトからこのプロジェクトへの参照を追加し、このサービスプロジェクトからデータモデルプロジェクトへの参照を追加しましたが、今どのように進めるかがわかりません。コントローラからこれらのメソッドにアクセスするにはどうすればよいですか?

4

1 に答える 1

4

コントローラからこれらのメソッドにアクセスするにはどうすればよいですか?

インスタンスメソッドにアクセスするには、オブジェクトのインスタンスが必要です。

public ActionResult Method(int Id)
{
    var foo = new FooServices().doThis(Id)
    return View("Error");
}

もちろん、これを行うことで、コントローラーロジックをサービスの特定の実装と強力に結合しているため、コントローラーを個別に単体テストすることは非常に困難です。

したがって、結合を弱めるには、抽象化を導入することから始めます。

public interface IFooServices
{
    List<Bar> DoThis(int id)
}

次に、サービスレイヤーにこのインターフェイスを実装させます。

public class FooServices: IFooServices
{
    public List<Bar> DoThis(int id)
    {
        //Do stuff
        return parentSets;
    }
}

これで、コントローラーはこの抽象化で機能するようになりました。

public class HomeController: Controller
{
    private readonly IFooServices service;
    public HomeController(IFooServices service)
    {
        this.sevrice = service;
    }

    public ActionResult Method(int id)
    {
        var foo = this.service.DoThis(id)
        return View("Error");
    }
}

すばらしいです。この段階では、コントローラーとサービスレイヤーの間に弱い結合があります。あとは、特定のサービスをコントローラーに注入するように、お気に入りの依存性注入フレームワークを構成するだけです。

于 2013-02-17T23:20:34.547 に答える