映射数据或逻辑/业务层的一部分?

时间:2018-05-22 21:22:37

标签: c# .net wcf architecture n-tier-architecture

我正在研究N层服务应用程序,它基本上是(我有非常具体的问题,但我需要先解释整个情况/架构)

数据 - >逻辑(商业) - > WCF服务 - >主持人(Winddows服务),其中:

数据,是数据持久性但没有连接字符串。一切都来自另一个WCF服务。所以我在这里只有ServiceReferences和一个类FooData,有几个方法(它实现IFooData接口)。如下所示,它返回Bar对象,该对象来自VS自动生成的BarServiceReference

using FooService.Data.BarServiceReference;

public class FooData : IFooData
{
    public BarDto Func1(int id)
    {
        try
        {
            using (BarServiceClient client = new BarServiceClient())
            {
                return client.GetBar(id);
            }
        }
        catch (System.ServiceModel.FaultException ex)
        {
            throw new Exception($"Inner exception in BarServiceClient: { ex.Message }", ex);
        }
    }        
}

逻辑,此处我有IMapper的映射配置文件和我通过DI FooLogicIFooData注入的类IMapper。在课堂上我有几个方法。其中之一:

public class FooLogic
{
    private IMapper Mapper { get; }
    private IFooData FooData { get; }
    public FooLogic(IMapper mapper, IFooData fooData)
    {
        Mapper = mapper;
        FooData = fooData;
    }

    public Bar GetBar(int id)
    {
        BarDto barDto = FooData.Func1(itemId);
        Bar bar = Mapper.Map<BarDto, Bar>(barDto);  

        // There are lot more, taken from the Data layer.
        // Some operations are performed.  The Bar is basically modified a little bit/adjusted



        return bar;
    }
}  

正如您所看到的,我的逻辑层必须知道“BarDto”,这迫使我将Reference包括在内。我不确定。

问题......

我应该从Bar图层而不是Data返回BarDto吗?在这种情况下,我将不得不将IMapper注入数据层。我已经阅读了很多,有些人在数据层中做过,有些人在逻辑层。像你的映射的引用应该在逻辑层而不是在数据层中,所以我很困惑。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我将您的另一个WCF服务称为数据源服务,它通过其操作返回自己的数据协定到您的数据访问层。现在,您的服务层不应该知道您的数据源服务对象。它应该是不可知的,因此将来,如果您计划使用其他数据源而不是另一个WCF服务,则不必担心重新编译服务层。您的服务层不应该对数据源有任何引用,这是使用单独数据访问层背后的想法之一。

因此,要回答您的问题,请在数据层中自行进行映射,而不是在服务层中进行映射。