3

これが Unity でどのように機能するかについて、少し混乱しています。次のシナリオを想定してみましょう。ServiceA と ServiceB の 2 つのサービスに依存する TestController というコントローラーがあります。現在、serviceA は 2 つのリポジトリ、RepositoryA1 と RepositoryA2 に依存しています。ServiceB は、1 つのリポジトリである RepositoryB に依存しています。さらに、ServiceA、RepositoryA1、および RepositoryA2 が UnitOfWork、UnitOfWork1 に依存しているとします。これを MVC3 と Unity アプリケーション ブロックに実装する方法がわかりません。誰かがこれをどのようにコーディングするべきかの例を提供できますか?

4

1 に答える 1

4

いろいろな意見がありますが、私が自分なりに考えてみた方法です。

UnitOfWork

public interface IUnitOfWork : IDisposable
{
    FooContext DbContext { get; }
    void Save();
}
public class UnitOfWork : IUnitOfWork
{
    protected string ConnectionString;
    private FooContext context;

    public UnitOfWork(string connectionString)
    {
        this.ConnectionString = connectionString;
    }

    public FooContext DbContext
    {
        get
        {
            if (context == null)
            {
                context = new FooContext(ConnectionString);
            }
            return context;
        }
    }
    ...
}

GenericRepository

public class GenericRepository<TEntity> :
    IGenericRepository<TEntity> where TEntity : class
{
    protected FooContext DbContext;

    public GenericRepository(IUnitOfWork unitOfWork)
    {
        this.DbContext = unitOfWork.DbContext;
    }

    ...
}

ここには一般的なリポジトリがありますが、特定のリポジトリを構築することもできます。

サービス

public class FooService : IFooService
{
    private IUnitOfWork unitOfWork;
    private IGenericRepository<Foo> fooRepository;
    private IGenericRepository<Bar> barRepository;

    public FooService(IUnitOfWork unitOfWork,
                      IGenericRepository<Foo> fooRepository,
                      IGenericRepository<Bar> barRepository)
    {
        this.unitOfWork = unitOfWork;
        this.fooRepository = fooRepository;
        this.barRepository = barRepository;
    }
}

メソッドにアクセスするには、IUnitOfWork を渡す必要がありますSave。リポジトリの1つから取得できたと思います。

UnityConfig

var container = new UnityContainer();
container.RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager(),
    new InjectionConstructor(ConnectionString));
container.RegisterType(typeof(IGenericRepository<>), typeof(GenericRepository<>));
container.RegisterType<IFooService, FooService>();
container.RegisterType<IBarService, BarService>();

コントローラ

private IFooService fooService;
private IBarSevice barService;

public HomeController(IFooService fooService, IBarService barService)
{
    this.fooService = fooService;
    this.barService = barService;
}
于 2013-06-04T04:02:44.430 に答える