5

私は現在、プロジェクトで ASP.NET MVC フレームワークを使用しています (ほぼ初めてです)。

データモデルとしてLinq2SQLを使用しています..

この種のコードはどこに置くべきですか:

var entries = from e in db.sometable select e;

現在、コントローラーにこのようなコードがあり、取得したデータをビューに渡します..

これでよろしいですか?

そうでない場合、linq2sqlデータモデルにこの種のコードを含めるにはどうすればよいですか?

ありがとう

ダニエル

4

4 に答える 4

5

@Poco の発言を追加するには、次の例を示します。

In Foo.Common.Repositories(Foo.Commonプロジェクト内):

public interface IRepository<T>
{
    IEnumerable<T> GetAll();
    void Update(T entity);
    void Add(T entity);
    void Delete(T entity);
    void Save();
}

public interface IUserRepository : IRepository<User>
{
    void GetByCredentials(string username, string password);
}

内部Foo.Data.Repositories(内部Foo.Dataプロジェクト):

public class UserRepository
{
    // ... other methods/properties snipped.

    public IEnumerable<User> GetAll()
    {
        // Where this.Users would be L2Sql or Code-First... or some other ORM.
        return from u in this.Users orderby u.Name select u;
    }
}

次に、実際の内部Foo.Web

public class UserController : Controller
{
    private readonly IUserRepository userRepository;

    public UserController(IUserRepository userRepository)
    {
         this.userRepository = userRepository;
    }

    [AcceptVerbs(HttpVerbs.Get)]
    public ViewResult List()
    {
        var users = this.userRepository.GetAll();
        return this.View(users);
    }
}

そして、Global.asaxあなたの中にNinjectまたは他のIoCコンテナを解決する必要がありますIUserRepository:

public static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IUserRepository>().To<UserRepository>();
}

protected void Application_Start()
{
    var kernel = new StandardKernel();

    AreaRegistration.RegisterAllAreas();

    MvcApplication.RegisterGlobalFilters(GlobalFilters.Filters);
    MvcApplication.RegisterRoutes(RouteTable.Routes);
    MvcApplication.RegisterServices(kernel);

    // I'm using MVC3 here:
    DependencyResolver.SetResolver(new NinjectResolver(kernel));
}
于 2010-11-25T12:20:30.810 に答える
2

MVC のリポジトリ パターンを使用するのが一般的です。通常、IProducts などのインターフェイスを定義してから、このインターフェイスを実装して、linq2sql コードを呼び出します。コントローラーは、このインターフェイスをコンストラクターのパラメーターとして受け入れるため、具体的なクラスではなく、このインターフェイスに依存します。Ninject などの依存関係インジェクターを使用すると、具体的なインターフェイスの実装をコンストラクターに提供できます。これにより、Web アプリでの単体テストが可能になり、柔軟性も追加されます。

Pro ASP.NET MVC 2 Framework という非常に優れた本があり、そのすべてが説明されています。私は現在それを読んでいますが、私はそれが大好きです。

于 2010-11-25T11:28:53.037 に答える
0

リポジトリパターンを実装する方法の例を次に示します

これに加えて、アプリケーションのビジネスロジックを処理し、コントローラーを軽量に保つための追加のレイヤーを実装します

于 2010-11-25T11:36:42.180 に答える
0

コントローラー メソッドで Linq クエリを使用しても問題ありません。

関心の分離について話している場合、データ レイヤー (この場合は、 を提供するリポジトリ (?) コードdb.sometable) がロジック コード (この場合はコントローラー メソッド) をデータストアから分離するという考え方です。

データベースではなくデータレイヤーに対してクエリを実行するため、基になるデータストアを変更しても、コントローラー コードは引き続き機能します。

できる限り多くのロジック コードをコントローラーからモデル コードに移動した方がよいと主張する人もいますが (ここの最初の回答を参照してください)、どこまで行きたいかによって異なります。

于 2010-11-25T11:32:07.590 に答える