However, I have to ask: what's so awful about the OP's original design?
Hey Bruce, don't use hyperbole

)
You implied in your original post that it stank and would cause myriad
problems in the future.
The term I used was 'had a bad smell'; this is a phrase used in refactoring
to describe something that doesn't quite feel right.
Yes, I'm sure that it could be much better, and
I'm sure that the frameworks you're talking about are far superior, but
then we're all working at different levels here.
I am not trying to set myself up as the all knowing guru; you should see the
problems I am having getting to grips with generics

)
What kinds of future problems will the OP's original design cause?
When you get classes that reference other classes that reference other
classes that reference the first class, you are starting to knit yourself
some pretty natty spaghetti code. I have consulted for several companies
that have used RAD development tools like Delphi, VB and others, where
developers are encouraged to put all thier code on the forms that they
design. No thought is given to creating standalone code that can be
referenced from more than one form. Soon you have forms that surface methods
and properties that are used in other forms, but the data required for those
methods may be back in the main form. So you get circular dependencies that
severely restrict separation of those forms when a client requires changes
to one or more of those forms. I am assuming the OP is using classes that
are not forms, but the principles are the same.
What things could he do
better without spending months or years building complex software
frameworks? I'm not implying that the frameworks you're talking about
are impractical... I'm just wondering how easy they are to implement
for people with limited knowledge and limited time.
My first question would be: why do you need such a tight interdependency
between classes located in different assemblies ?
As well, in my experience design choices usually hinge on many factors:
project timelines, developer skill, the nature of the particular
business(es) that will use the software (in other words, what is likely
to change in the future and what isn't), and aesthetics. In order to
understand why (or whether) a particular design is good or bad, I need
to understand what are the consequences of choosing that design, and
decide whether those consequences matter in the context of my business.
An excellent design for one context may be vast overkill for another,
while an adequate design in that context may be woefully inadequate in
another.
I would agree with those sentiments. My experience is with companies who
were spending so much time fixing broken code that they didn't have the time
to write good code :-( As with most commercial enterprises, compromise is
not always the easiest attitude to produce good software at low cost. I am
at present completely re-architecting a vertical market application for a
company who do a lot of customisations for their customers. Their original
procedural based program has got so complex that, whenever they add
somethign new, they are very likely to break something else.
Good OO design doesn't have to be complex, just a little better thought out
than the point/click form design that a lot of RAD developers hope to get
away with

)
In the case of the OP, if they can answer the question as to why the close
coupling is thought to be necessary, this may well open the way for a
simpler solution.
So, what sorts of the problems can the OP expect in the future if he
just folds the business layer and the data layer into one DLL... or
provides an interface of the kind that I described?
I suppose the biggest problems that occur are the restriction of having to
use the business classes with the same database, instead of being able to
re-use them in other applications; as well as the extra work that can be
involved when you get a client who just *insists* that you use is legacy
hierarchical database instead of SQLServer.
A well designed OPF can make changing databases so easy that a new
Connection (an OO sort of database driver) can usually be written in less
than an afternoon for most different flavours of SQL.
I ask because I'm battling with the same problems here, and could use
some expert advice.
I have only just started to post into the Microsoft groups, but the Borland
groups have a dedicated OO design group, in which we have been discussing
frameworks and layers for some years now. If you care to Google that group
(borland.public.delphi.oodesign) you will find a large resource of questions
and answers from some of the top OO gurus in the Delphi world. Most of the
advice is given in Delphi, but works just as well in C#.
You don't have to 'go all the way' with frameworks to get good results;
refactoring and use of design patterns can slowly transform even the most
ramshackle of code into a much better state
Joanna