Search code examples
c#.netcircular-dependencycircular-reference

How to fix this "circular reference" c#


i have a Class Library to hold my objects so:

xxxCommon\Objects\Customer.cs

    public class Customer
    {
        public string url { get; set; }
        public List<Telephone> telephones { get; set; }
    }

xxxData\DC\CustomerDC.cs (DataComponent)

  • This class call many procs and return objects in xxxCommon\Objects

My main problem now is circular reference, to make a "lazy" load i need to set the get of telephones atributes to a function in xxxData\DC, how can avoid this ?


Solution

  • One way you can resolve a circular dependency is to have a layer in between your two assemblies:

    Rather than this scenario;

    Assembly Model:

    public class Customer{ 
        //...
    }
    

    Assembly Data:

    public class CustomerDAO{
        public Customer LoadCustomer(int id){
             return new Customer(id,...);
        }
    }
    

    where the Model assembly references the Data assembly and Data can't reach back into Model to instantiate a Customer.

    You can have instead;

    Assembly Model:

    public class CustomerModel:Customer{}
    public class ModelFactoryImp:ModelFactory{
        public Customer CreateCustomer(int id,//...customer params){
            return new CustomerModel(...);
        }
    }
    

    Assembly ModelInterfaces:

    public abstract class Customer{//...}
    public abstract ModelFactory{
        Customer CreateCustomer(int id,//...customer params);
    }
    

    Assembly Data:

    public class CustomerDAO{
        private ModelFactory _modelFactory;
    
        public CustomerDAO(ModelFactory modelFactory){
             _modelFactory = modelFactory;
        }
    
        public Customer LoadCustomer(int id)
        { 
            // Data Access Code
            return _modelFactory.CreateCustomer(id,//...cutomer params);
        }
    }
    

    Where both Model and Data assemblies depend on the ModelInterfaces layer and you pass the Customer Data Access Object an implementation of the ModelFactory class so that it can create Customers.