views:

67

answers:

4

I have two assemblies A & B.

A has existing reference to B and it must be kept that way. Right now I made some changes to B that need to refer to A. So circular reference occurs.

Bit of details:

A has a few property grids that the dialog in B needs to be hosted. So to avoid this circular reference issue I tried to define interfaces to grids in third assembly to which A & B both refer, and make B only refers to the interfaces.

Two issues I'm facing:

  1. there’s too much custom data types (properties to be specific) inside the grids which are defined inside A and I have to define interfaces for every one of them.

  2. I see example of this works with function parameter e.g. call target function through the interface passed in. But how would it fit considering the following code - I can't new a ICustomPropertyGridWrapper...

    object = new CustomPropertyGridWrapper(...)
    m_property.SelectedObject = object;

Thanks,

A: 

Refactor your code or merge assemblies = don't use circular reference. It is symptom of very bad design.

Best regards, Ladislav

Ladislav Mrnka
Harsh judgment of the design, considering you know almost nothing about it, and no real advice... I don't think you're being very helpful.
Kobi
I don't but if you check other answers they are describing the same solution - refactor or merge. So it is helpful enough.
Ladislav Mrnka
And it's only a symptom of a bad design. A good design can have symptoms of bad designs, if there's a justification for it, but a good designer will still pay attention to those symptoms and make sure they truly are justified, and that they remain justified as things change.
Jon Hanna
I definitely agree.
Ladislav Mrnka
There is nothing harsh about this answer. Having two assemblies that reference each other is, at the very least, awkward to work with.
Brian Gideon
+1  A: 

For issue 1, there is not really a solution other then merge the two projects or do some code generation

For the second, you can do that by implementing the Factory design pattern.

Ewald Hofman
+1  A: 

Sounds like you are attempting death by interface. Not everything has to be exposed by interface.

A simple answer is to either merge the assemblies, or move the common controls and data types to a third assembly. You only need to interface things if you want a consistent contractual way to access or work with things, and you want to hide the actual implementation.

slugster
A: 

If B now depends on bits of A perhaps you should refactor those bits out into a new assembly C which would be referenced by both A and B.

ChrisF