自上而下的架构我的业务层无法访问我的数据访问层,出了什么问题?

时间:2015-03-23 04:04:50

标签: c# asp.net-mvc architecture domain-driven-design

使用Asp.Net MVC我想要一种自上而下的方法。我开始使用自上而下的方法,但现在看来它是洋葱方法,因为我在数据访问层中的存储库接口需要引用我的模型层,以便它理解它返回的对象。所以现在我正在引用而不是下来。

现在我在业务层中的模型(DiaryEvent)中有一个方法(LoadAllAppointmentsInDateRange),它需要在下面的数据访问层中调用存储库,但它不能,因为会有循环引用。我是如何搞砸这个架构的,我该如何修复它?我应该创建另一个处理此问题的层(服务层)并将方法(LoadAllAppointmentsInDateRange)放入其中,还是应该移动我的接口?

以下是我所拥有的以及我想在简化程度上做的事情。

控制器(顶层) -

public JsonResult GetDiaryEvents(double start, double end)
    {
        var apptListForDate = DiaryEvent.LoadAllAppointmentsInDateRange(start, end);
        //do some other stuff
        return Json(rows, JsonRequestBehavior.AllowGet);
    }

业务层(中间层) -

public class DiaryEvent
{

    public int ID;
    //other memebers here


    public static List<DiaryEvent> LoadAllAppointmentsInDateRange(double start, double end)
    {
        // logic here

        // want to access the repo here, but can't because data access layer is referencing this layer (business layer)
        IYogaSpaceEventRepository eventRepository = new YogaSpaceEventRepository();
        IQueryable<YogaSpaceEvents> events = eventRepository.FindEvents(startTime, endTime);


        //do some processing of the returned data
        return result;
    }
}

访问层(底层) - 它引用业务层。

public class YogaSpaceEventRepository : IYogaSpaceEventRepository
{
    YogaContext context = new YogaContext();

    public IQueryable<YogaSpaceEvent> FindEvents(DateTime start, DateTime end)
    {
        var rslt = context.YogaSpaceEvents.Where(s => s.DateTimeScheduled >= start 
            && DbFunctions.AddMinutes(s.DateTimeScheduled, s.AppointmentLength) <= end);

        return rslt;
    }  

    public void Dispose()
    {
        context.Dispose();
    }
}

public interface IYogaSpaceEventRepository : IDisposable
{
    // here my repo (data access layer) is referencing my business layer to return YogaSpaceEvent
    IQueryable<YogaSpaceEvent> FindEvents(DateTime start, DateTime end); 
}

2 个答案:

答案 0 :(得分:0)

以下是您应该如何构建项目:

在您的业务逻辑层中,您可以按如下方式存储业务实体和存储库接口:

public class YogaSpaceEvent
{
    // Function and Data Members
}

public interface IYogaSpaceEventRepository
{
    IQueryable<YogaSpaceEvent> FindEvents(DateTime start, DateTime end);
}

public class DiaryEvent
{
    private IYogaSpaceEventRepository _repository;

    public DiaryEvent(IYogaSpaceEventRepository repository)
    {
        this._respository = repository;
    }

    public static List<DiaryEvent> LoadAllAppointmentsInDateRange(double start, double end)
    {
        // Call appropriate method on _repository
    }
}

在您的数据访问层(DAL)中,添加对BLL的引用并实现YogaSpaceEventRepository存储库:

public class YogaSpaceEventRepository : IYogaSpaceEventRepository
{
    public IQueryable<YogaSpaceEvent> FindEvents(DateTime start, DateTime end)
    {
        // Retrieve Data from Database
    }
}

在您的表示层(MVC Controller)中,首先必须添加对BLL和DAL的引用,然后创建一个DiaryEvent对象注入 YogaSpaceEventRepository存储库的实例,如这样:

public class PresentationLayer
{
    public void Test(double start, double end)
    {
        DiaryEvent diaryEvent = new DiaryEvent(new YogaSpaceEventRepository());
        var apptListForDate = DiaryEvent.LoadAllAppointmentsInDateRange(start, end);
    }

}

答案 1 :(得分:0)

如果您所谓的业务层等同于DDD中的域层,则它不应该了解数据访问。

委托对知道当前应用程序执行状态的Application层的数据访问,并保持核心域没有持久性详细信息。通过这种方式,它可以很好地解耦 - 你可以在不改变核心业务规则的情况下放置你想要的任何持久性和任意数量的应用系统。