2

単一のプロジェクトASP.NETWebフォームアプリケーションのコンテキストでHighway.Data.EntityFramework.Unityパッケージを評価しています。

サービスレイヤーに簡単にアクセスしたい。グローバルの関連部分は次のとおりです。

public class Global : HttpApplication
{
    private static readonly IUnityContainer Container = new UnityContainer();

    public static IEmployeeService Service { get; private set; }

    protected void Application_Start(object sender, EventArgs e)
    {
        Container.BuildHighway();
        Container.RegisterType<IMappingConfiguration, EntityMapping>();
        Container.RegisterType<IEmployeeService, EmployeeService>(
            new PerRequestLifetimeManager());
        Container.RegisterType<IRepository, Repository>(
            new PerRequestLifetimeManager());
        Container.RegisterType<IDataContext, DataContext>(
            new PerRequestLifetimeManager(), 
            new InjectionConstructor("DataContext", new EntityMapping()));

        Service = Container.Resolve<IEmployeeService>();
    }
}

私のクライアントでは、次のようにアクセスできます。

this.Employees.DataSource = this.service.GetEmployees();
this.Employees.DataBind();

正常に動作しますが、これまでこのアプローチを採用したことはなく、問題がないように見えるからです...そうですね。そうでない場合、私は何をしますか?

[編集済み]要求された明確さのため。

サービス:

public class EmployeeService : IEmployeeService
{
    private readonly IRepository repository;

    public EmployeeService(IRepository repository)
    {
        this.repository = repository;
    }

    public IEnumerable<Employee> GetEmployees()
    {
        return this.repository.Find(
            new AllEmployeesQuery())
            .ToList()
            .Select(ObjectMapper.Map<EmployeeEntity, Employee>);
    }
}

AllEmployeesQueryは仕様です。ビジネスオブジェクトは、AutoMapperによってEFエンティティにマップされ、その逆も同様です。

ありがとう、リチャード

4

1 に答える 1

0

疫病のようなこのアプローチは避けたいと思います。アプリケーション レベルでデータベース接続またはリソースを共有しないでください。お粗末なパフォーマンスと微妙なバグにつながります。

私が見つけた最良のモデルは、リクエストごとに接続を作成し、それを現在のリクエストに保存して、リクエストの有効期間中に発生する可能性のある他の呼び出しで接続を利用できるようにすることです。

次のコードは、データ層の静的プロパティです。デフォルトの動作では、最初の get で接続をインスタンス化し、それをリクエストに保存します。その後、このプロパティにアクセスすると、以前に作成されたインスタンスが返されます。また、このプロパティにより、ユーザーは HttpContext がない場合にこれを明示的にオーバーライドすることもできます。

protected static dataLayer DataContext
{
    get
    {
        if (HttpContext.Current == null)
        {
            if (StaticContext == null)
                StaticContext = new dataLayer();

            return StaticContext;
        }

        if (HttpContext.Current.Items["dataLayer"] == null)
            HttpContext.Current.Items["dataLayer"]= new dataLayer();

        return (dataLayer)HttpContext.Current.Items["dataLayer"];
    }
}
于 2012-10-25T22:50:41.720 に答える