Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET站点,EF,分层体系结构,我的设计可以吗,还是应该纠正它?_Asp.net_Entity Framework_Architecture - Fatal编程技术网

ASP.NET站点,EF,分层体系结构,我的设计可以吗,还是应该纠正它?

ASP.NET站点,EF,分层体系结构,我的设计可以吗,还是应该纠正它?,asp.net,entity-framework,architecture,Asp.net,Entity Framework,Architecture,我有一个DAL项目,其实体数据模型上下文与EF4.1绑定 我提供了通过“业务”项目访问此上下文的方法 我的问题如下: 我想我不应该从业务项目以外的地方引用DAL项目,所以我的想法是,我可以在我已有的公共项目中添加“DataContract”接口,在DAL项目中引用该项目,扩展EF为我自动生成的部分类,继承每个数据契约对应的数据契约,并将这些数据契约用作业务项目中操作的返回值,从而隔离DAL项目,避免将其与业务或web项目紧密耦合 我的想法是正确的还是有点离题 更新在重读我自己的问题时,我发现这类

我有一个DAL项目,其实体数据模型上下文与EF4.1绑定

我提供了通过“业务”项目访问此上下文的方法

我的问题如下:

我想我不应该从业务项目以外的地方引用DAL项目,所以我的想法是,我可以在我已有的公共项目中添加“DataContract”接口,在DAL项目中引用该项目,扩展EF为我自动生成的部分类,继承每个数据契约对应的数据契约,并将这些数据契约用作业务项目中操作的返回值,从而隔离DAL项目,避免将其与业务或web项目紧密耦合

我的想法是正确的还是有点离题

更新在重读我自己的问题时,我发现这类问题很难理解,下面是一个我如何做到这一点的示例,模型中有一个实体:

该实体为:

namespace Application.Website.Main.Common.DataContracts
{
    public interface IServerApplication
    {
        string Id { get; set; }
        string ApplicationName { get; set; }
        byte MaxAccountsPerUser { get; set; }
        bool Enabled { get; set; }
    }
}
这将出现在Application.Website.Main.Common项目中

在DAL项目中,我将引用公共项目,并扩展
ServerApplication
的部分类以从该接口继承,无需进一步更改

namespace Application.Website.Main.DAL
{
    public partial class ServerApplication : IServerApplication
    {

    }
}
在业务项目中,我将引用DAL和通用项目,并将这些DataContracts用作返回类型:

namespace Application.Website.Main.Business.Entities
{
    public class ServerApplication
    {
        public static IEnumerable<IServerApplication> Enabled()
        {
            var context = HttpContext.Current.GetDataContext();
            return context.ServerApplications.Where(a => a.Enabled);
        }
    }
}
顺便问一下,我应该在哪里试一试 在使用数据上下文的每个业务级方法上都应该这样做吗?
还是别的地方?
在这个级别处理异常的最佳方法是什么

更新我发现我的逻辑有漏洞。例如,如果我希望给定实体的业务类中有一个方法,那么它必须是静态的和/或接口的扩展方法。像这样:

namespace Application.Website.Main.Business.Entities
{
    public class MembershipUser
    {
        public static int GetRequestCount(this IMembershipUser user)
        {
            var context = HttpContext.Current.GetDataContext();
            return context.ServerAccountRequests.Count(r => r.MembershipUserId == user.UserId);
        }
    }
}
或者,只传递查询所需的最少信息:

namespace Application.Website.Main.Business.Entities
{
    public class MembershipUser
    {
        public static int GetRequestCount(Guid userId)
        {
            var context = HttpContext.Current.GetDataContext();
            return context.ServerAccountRequests.Count(r => r.MembershipUserId == userId);
        }
    }
}
但是,如何创建一个类,以便只使用实例方法,如user.GetRequestCount()?那么DataContract将需要是一个类而不是一个接口。。。或者我应该让这个类也从DataContract继承,但是我必须实现它的所有成员,我不打算再这样做了,因为这已经由EF在DAL级别处理了

我想我不应该从什么地方引用DAL项目 除了商业项目

这取决于你如何引用它。简而言之,即使您的业务逻辑(BL)也不应该引用DAL的物理实现,它应该引用定义DAL的接口;然后,应动态加载混凝土推进器

这是基于这样一个假设,即项目的规模非常小——您仍然可以编写小型PoC等,不管您喜欢什么

我可以将“DataContract”接口添加到我已经完成的公共项目中 有

我会在它们自己的程序集中定义数据契约,而不是在一个公共项目中,否则引用公共项的所有内容都“知道”数据契约(这是您真正想要的),如果您在数据契约中有任何依赖项,那么引用公共项的所有内容也将获得这些额外的不需要的依赖项

虽然我定义的数据契约应该是一个单独的程序集,但DTO/POCO对象可以是通用的;我以前也这样做过,并取得了很好的效果,因为我使用这些对象在不同层之间传递数据,而不仅仅是在DAL和BL之间

您的amin应该在具体的DAL实现中保留所有数据访问和EF引用(如SQL)

我想我不应该从什么地方引用DAL项目 除了商业项目

这取决于你如何引用它。简而言之,即使您的业务逻辑(BL)也不应该引用DAL的物理实现,它应该引用定义DAL的接口;然后,应动态加载混凝土推进器

这是基于这样一个假设,即项目的规模非常小——您仍然可以编写小型PoC等,不管您喜欢什么

我可以将“DataContract”接口添加到我已经完成的公共项目中 有

我会在它们自己的程序集中定义数据契约,而不是在一个公共项目中,否则引用公共项的所有内容都“知道”数据契约(这是您真正想要的),如果您在数据契约中有任何依赖项,那么引用公共项的所有内容也将获得这些额外的不需要的依赖项

虽然我定义的数据契约应该是一个单独的程序集,但DTO/POCO对象可以是通用的;我以前也这样做过,并取得了很好的效果,因为我使用这些对象在不同层之间传递数据,而不仅仅是在DAL和BL之间


您的amin应该在具体的DAL实现中保留所有数据访问和EF引用(如SQL)。

对于我想要添加业务逻辑方法的BL,如何在不重复使用“所有静态”类和方法或复制每个字段名称(例如,简单插入)的情况下实现这一点抱歉-我不确定我是否完全理解您的要求。对于我想添加业务逻辑方法的BL,如何在不重复使用“所有静态”类和方法或复制每个字段名称(例如,对于简单的插入)的情况下实现这一点?抱歉-我不确定我是否完全理解您的要求。
namespace Application.Website.Main.Business.Entities
{
    public class MembershipUser
    {
        public static int GetRequestCount(Guid userId)
        {
            var context = HttpContext.Current.GetDataContext();
            return context.ServerAccountRequests.Count(r => r.MembershipUserId == userId);
        }
    }
}