2

我正在单个项目 ASP.NET Web 窗体应用程序的上下文中评估Highway.Data.EntityFramework.Unity包。

我想轻松访问我的服务层。以下是 Global 的相关部分:

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

你想像瘟疫一样避免这种方法。不要在应用程序级别共享数据库连接或资源;这将导致糟糕的性能和微妙的错误。

我发现的最佳模型是为每个请求创建一个连接并将其存储在当前请求中,以使该连接可用于请求生命周期内可能发生的任何其他调用。

以下代码是我们数据层中的静态属性。默认行为是在第一次获取时实例化一个连接并将其存储在请求中,随后对该属性的访问将返回之前创建的实例。该属性还使用户能够在没有 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 回答