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?
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.