Circular References in my C# projects
c#, circular-dependency
Solution
Your `Utility` project referencing your `MyCompany.MyProject.Domain` seems like a bit of a code smell. I'm assuming here that these are utilities that specifically work on domain objects--if that's the case, then why don't you include `MyCompany.MyProject.Utilities` within your `Domain` project (naturally, modifying the namespace accordingly)?
In any case, the normal way to break these kinds of dependencies is to abstract what is required by one project into a set of interfaces, and encapsulate those in a separate assembly. Before doing that though, make sure that what you're doing conceptually is the right thing.
In your particular situation though, consider introducing an interface, viz., `INameHolder`:
public interface INameHolder
{
string FirstName { get; set; }
string LastName { get; set; }
}
Then `Contact` implements `INameHolder`. `INameHolder` exists in another assembly, let's call it `MyCompany.MyProject.Domain.Interfaces`.
Then your `Utilities` project references `Interfaces` (not `Domain`) and so does `Domain`, but `Interfaces` doesn't reference anything--the circular reference is broken.
Problem
I have the following situation: A project `MyCompany.MyProject.Domain` which contains my domain model, and partial classes (such as `Contact`). I want to 'extend' (by partial class, not extension method) my `Contact` class with a property `Slug` which will give me a simple URL friendly text representation of first and last name. I have a string extension method `ToSlug()` in my `Utility` project `MyCompany.MyProject.Utilities` which does exactly what I want in 2). The problem: My `Utility` project is already referencing my `Domain` project which means that I can't get the `Domain` project to see the `Utility` project's `ToSlug()` method without causing circular reference. I'm not keen on creating another project to solve this, and I really want to keep the `Slug` logic shared. How can I solve this?