4

EFを使用してMVC3で適切な方法でコードを分離する方法を知りたいだけです

私のプロジェクト構造によると。

プレゼンテーション->ビューとコントローラー

ドメイン->モデル(事業体)

データ->RepositoryBase、IRepository、ApplicationDbContext

サービス->サードパーティサービス(PayPal、SMS)またはアプリケーションサービス

ApplicationDbContextには、参照としてModelが必要です。

public sealed class ApplicationDbContext : DbContext
{

    public DbSet<CountryModel> Country { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}

1.では、DbContextをデータに配置するのは良いことですか?または、ドメインに移動する必要がありますか?

今コントローラーで私はコードを書かなければなりません

using (ApplicationDbContext db = new ApplicationDbContext())
{
    var countryRepository = new Repository<Country>(db);

    if (ModelState.IsValid)
    {
        countryRepository.insert(country);
        db.SaveChanges();
    }
}

このコードブロックをビジネスレイヤー/サービスレイヤーで分離する方法はありますか?

したがって、残りの操作を実行するために、コントローラーからそのレイヤーを呼び出し、特定のビジネスエンティティを渡すだけです。

PL-> BLL-> MVC 3&EFを使用したDLLアプローチを実行したいですか?

適切な方法を教えてください。

4

2 に答える 2

2

Uは、BLLで相互に個別のプロジェクトを作成し、そこにある各ビジネスエンティティの呼び出しリポジトリフォームのクラスを作成し、そこに必要ないくつかの基本的な関数を作成できます。

var country =new Country();//it's class of BLL

if (ModelState.IsValid)
{
    country.insert(country);
}

そんな感じ

于 2013-01-08T07:28:07.583 に答える
2

では、DbContextをデータに配置するのは良いことですか?

はい、それはそれが属する場所です。

今コントローラーで私はコードを書かなければなりません

いいえ、使用している特定のデータアクセステクノロジ(この場合はEF)にコントローラを強力に結合しているため、コントローラにこのようなコードを記述しないでください。さらに悪いことに、コントローラーを単独で単体テストすることはできません。

インターフェイス内のエンティティに対する操作を抽象化することをお勧めします(ところで、質問ですでに言及しています- IRepository)。そして今、あなたのコントローラーはリポジトリを依存関係としてとることができます:

public class CountriesController: Controller
{
    private readonly IRepository repository;
    public CountriesController(IRepository repository)
    {
        this.repository = repository;
    }

    public ActionResult Index(int id)
    {
        Country country = this.repository.Get<Country>(id);
        return View(country);
    }


    [HttpPost]
    public ActionResult Index(Country country)
    {
        if (ModelState.IsValid)
        {
            this.repository.Insert(country); 
            return RedirectToAction("Success");
        }

        return View(country);
    }
}

これで、このIRepositoryの特定の実装をコントローラーコンストラクターに注入するように、お気に入りの依存性注入フレームワークを構成するだけです。あなたの場合、この特定の実装は、IRepositoryインターフェースを実装し、ApplicationDbContext内部を使用しているクラスである可能性があります。

このようにして、コントローラーからデータアクセスロジックを抽象化します。

于 2013-01-08T07:32:57.073 に答える