Search code examples
c#asp.netn-tier-architecturecircular-reference3-tier

Circular reference issue in 3-tier architecture C#


I want to build a web application with 3-tier architecture in ASP.NET. But I am getting a problem of circular referencing.

I have 3 layer:

  1. Application layer containing UI.
  2. Business layer containing all the logic and domain classes.
  3. Data layer containing all database interaction methods.

I am using the data layer methods in business layer to perform database operations and in these methods I need to pass domain class object to data layer but it can not be done due to circular referencing.

For example I have a Person domain class containing some properties and methods. Now I want to insert that Person into database. I have a method in Person class, named as InsertPerson(). In this method body, I have to call the function of Data layer to insert into database. But I am not able to pass the whole person object into data layer method as data layer reference is added to business layer and vice-versa is not possible.

So how can I avoid this problem? Please suggest.


Solution

  • Is it possible to split the domain objects from the business logic for manipulating them? So you have classes describing the data, containing relatively primitive operations, and then your business layer is more actions on the data - often using several different classes in one action.

    You then end up having four assemblies:

      UI              /
      Business logic  | Domain classes
      Data layer      \
    

    So all three layers use the domain classes as common terminology, effectively.

    I've seen this work pretty well - it does mean that your domain classes typically become slightly "dumb", although they can still contain relevant logic around some validation etc for aspects which are independent of other classes.

    Of course, there are plenty of alternative approaches :)