2

UnitOfWork / Repository / MVC アプリケーションに取り組みました。これで問題なく動作するようになったので、UnitOfWork をコントローラーから切り離したいと思います。これを行う 1 つの方法は、コントローラーのコンストラクターで Ninject (またはその他) を使用して依存関係を注入することです。ただし、これは UnitOfWork がコントローラーと同時にインスタンス化されることを意味します。

UnitOfWork を使用する方法は、次のような Using ブロックです。

using(var unitOfWork = new IUnitOfWork)
{
    return unitOfWork.GetRepository<IEmployeesRepository>().GetAllEmployees();
}

明らかに、インターフェイスをインスタンス化することはできません。依存性インジェクターで注入されたインスタンスの実装がありますが、using 句にどのように注入できますか?

プロパティ注入とメソッド注入を見ましたが、それらを使用して目標を達成する方法がわかりません。

4

4 に答える 4

2

コンテナに登録したファクトリを使用します。

public class UserController : Controller
{
    IUnitOfWorkFactory _factory;

    public UserController(IUnitOfWorkFactory factory)
    {
        _factory = factory;
    }

    public ActionResult DoSomething()
    {
        using(var unitOfWork = _factory.Create())
        {
            return unitOfWork.GetRepository<IEmployeesRepository>().GetAllEmployees();
        }
    }
}

UoWの処理を抽象化することをお勧めします:http://blog.gauffin.org/2012/06/how-to-handle-transactions-in-asp-net-mvc3/

于 2012-10-31T15:51:21.937 に答える
1

これは、Autofac を使用して簡単に行うことができます。他の IoC コンテナにも同じ機能があるはずです。

ここにwikiへのリンクがあります。

コードの例:

public class UserController : Controller
{
    Func<Owned<IUnitOfWork>> unitOfWorkFactory;

    public UserController(Func<Owned<IUnitOfWork>> unitOfWorkFactory)
    {
        this.unitOfWorkFactory = unitOfWorkFactory;
    }

    public ActionResult DoSomething()
    {
        using(var unitOfWork = this.unitOfWorkFactory().Value)
        {
            return unitOfWork.GetRepository<IEmployeesRepository>().GetAllEmployees();
        }
    }
}

追加の登録は必要ありません。インターフェースの実装を登録するだけです。

于 2012-10-31T16:32:59.447 に答える
0

[..] using句に挿入するにはどうすればよいですか?

using条項はなくなります。IoCコンテナが依存関係を注入する場合、IoCコンテナはその存続期間に責任があります。

依存関係を破棄することはお勧めできません(そしてそれをusing正確に実行します)。


プロパティインジェクションとメソッドインジェクションを見ました

可能な場合は常にコンストラクタインジェクションを使用してください。プロパティ/メソッドインジェクションは、いくつかの特殊なケースで使用されます。

コンストラクタインジェクションの良いところは、クラスがその依存関係をすぐに明らかにすることです。また、インスタンスを作成できるのは、必要なすべての依存関係が提供された場合のみです。

プロパティインジェクションを使用すると、必要な依存関係を設定するのを忘れることがあります。これは、依存関係がオプションである場合、デフォルトの実装がある場合、または循環依存関係グラフを壊す場合にのみ使用してください。

メソッドインジェクションを使用すると、同じメソッドパラメータでコードを何度も肥大化させる可能性があります。


[...]そのコントローラーの同じインスタンスでUnitOfWorkを2回使用したい場合はどうなりますか。Ninjectはそれを再び注入しますか?

Ninjectは、動作の指示に応じて、同じインスタンスを2回注入するか、2つの異なるインスタンスを作成します。

IoCコンテナを使用すると、注入されたコンポーネントのライフタイムスタイルを指定/構成できます。Ninjectについては、オブジェクトスコープを指定する方法を参照してください。

于 2012-10-31T15:11:17.417 に答える
0

using ブロックで変数をインスタンス化する必要はありません。既存の変数を使用できます。したがって、次のようにメソッドインジェクションを使用できます。

public ActionResult Index(IUnitOfWork unit)
{
    using(unit)
    {
         // Do some work....
    }

    // Return an action
}

unit は using ブロックを離れると破棄されるので、使用しないでください。

于 2012-10-31T15:07:49.597 に答える