|
Colin Angus Mackay wrote:
1, 2 and 4 seem reasonable. (Is 3 AWOL?)
I don't know what AWOL is, but it has just gone down the road...
Colin Angus Mackay wrote:
What do you mean by a "nice, clean and understandable object heirarchy"? Do you mean the way the classes relate to one another, the namespace that a class might sit in or what?
I don't mean the namespaces, these classes might sit in. It's rather the way, classes relate to one another, eg.:
Say we have a root class (top-level), called DB_App, this class might then have a property allowing access to the Projects collection, which in turn might be used to access a Project instance which in turn has a property called ProjectServices (collection), and so on. Is this reasonable?
Matthias
If eell I ,nust draw to your atenttion to het fakt that I can splel perfrectly well - i;ts my typeying that sukcs.
(Lounge/David Wulff)
www.emvoid.de
|
|
|
|
|
AWOL = Absent WithOut Leave
Yes, your suggestion seems reasonable. But, I find that object relations often closely map to the relationships in the database, so if your data model is heirarchical then it would follow that so will your class model be.
"You can have everything in life you want if you will just help enough other people get what they want." --Zig Ziglar
The Second EuroCPian Event will be in Brussels on the 4th of September
Can't manage to P/Invoke that Win32 API in .NET? Why not do interop the wiki way!
My Blog
|
|
|
|
|
Colin Angus Mackay wrote:
Yes, your suggestion seems reasonable. But, I find that object relations often closely map to the relationships in the database, so if your data model is heirarchical then it would follow that so will your class model be.
Yes, for sure. But I'm more concerned about how to deal with the commands and the access to them. I imagine the db-design for the command type of things somewhat like this:
Database-Tables:
Commands (contains a record for each command, e.g. "View all projects"
UserGroups (self explanatory)
Users (self explanatory)
UserGroups_Commands (a table matchings those two. one column for the commandid and one for the usergroupid)
But how do I deal with it in the application? How to build the menus? Some commands might not be available through the menu. For example I have a Treeview in the application that allows to navigate the projects. For users which belong to groupA, all projects might be navigated. For those of groupB only a subset.
Any ideas?
Matthias
If eell I ,nust draw to your atenttion to het fakt that I can splel perfrectly well - i;ts my typeying that sukcs.
(Lounge/David Wulff)
www.emvoid.de
|
|
|
|
|
First off, congratulations on your noble goals.
In the past, I have typically created what I think of as "heavy" business objects, which contain the queries used to persist them, properties that can be used to get related objects, validation, etc. I have found this design to be inflexible, and the objects can become overly complex. Better is to separate these into multiple classes, and let each one be simple, and do what it does well. (This also makes them easy to write).
For example, in my more recent projects, I have taken to splitting each business object into 2 separate parts. The first is for persisting and retrieving data, and does the object-relational db mapping. The second contains object properties, and not much else. Validation is coded outside of these objects, so as to be re-usable at different levels.
Thus, I might have 2 classes, Business.Customer and Data.Customer . To retrieve a customer from the database, I say something like MyCustomer = Data.Customer.GetById(customerId) .
If I want to retrieve the address of the Customer, I say MyCustomerAddress = Data.Address.GetById(MyCustomer.AddressId) (whereas before, I would say MyCustomerAddress = MyCustomer.Address) ). The old technique was a false economy, primarily because it created inflexibility while adding very little (I can still do it in a single line of code).
This works out great for me, and here's the clincher - the classes are all generated from the database, using a tool called CodeSmith. Once they are generated, I tweak them as needed. Mostly, I can then concentrate on the coding of my actual application, without worrying about SQL, etc.
IMO, "business" object design should be no harder than database design. Bang those together (preferably using tools), and then you can concentrate on the more challenging pieces, such as security, validation, and your controlling logic.
|
|
|
|
|
Hi Matthias,
Take a look at Martin Fowler's "Patterns Of Enterprise Application Architecture", it'll clean up your ideas.
As a quick suggestion I give the following:
BLL:
1) Organize your objects in Domain Logic, provide a Layer supertype (base object) for all of them
2) Create strongly typed collections for entities
3) Create business operations objects
DAL:
1) Create DACs (aka Data Mappers) for each entity object
2) Use DataSets (called Data Transfer Objects DTOs here) to pass data between DAL and BLL
Helper Layer:
Use metadata mapping (via Reflection) or XML represenation to convert data rows to business entities
Regards,
Serge (Logic Software, Easy Projects .NET site)
|
|
|
|
|
I second that book recommendation.
"You can have everything in life you want if you will just help enough other people get what they want." --Zig Ziglar
The Second EuroCPian Event will be in Brussels on the 4th of September
Can't manage to P/Invoke that Win32 API in .NET? Why not do interop the wiki way!
My Blog
|
|
|
|
|
Hi!
I am having an interesting problem while compiling code across different projects in the same VS.NET solution. Here is the scenario:
1. I have a project (called DataTypes) which defines common classes that I want to use throughout.
2. There is a webservice (WSA) which has a method which accepts two objects:
MethodA(DataTypes.Type1 objType1, DataTypes.Type2 objType2)
3. This webservice also calls another webservice (WSB) from MethodA. The method in WSB has the following signature: MethodB(DataTypes.Type1 objType1, DataTypes.Type2 objType2). In the WSA project there is a web reference to WSB (lets call it refB).
So this looks like:
MethodA(DataTypes.Type1 objType1, DataTypes.Type2 objType2){
objType1.somefield=new_value;
refB.MethodB(objType1, objType2);
}
When the client invokes WSA it passes the objects. MethodA modifies one of the parameters and passes these to WSB.
4. This code gives me a compilation error. The error message is "Cannot convert DataTypes.Type1 to refb.Type1". Understandably, the type information in the generated proxy for WSB refers to its interpretation of what Type1 is. Even though its the same as that in WSA.
Any suggestions on how I can solve this problem?
Thanks!
|
|
|
|
|
Hi,
I remember reading somewhere that when you pass an object to a webservice, it gets autoconverted to a proxy object, which _is not_ of the same type as the one being passed. That is the problem, imho.
It is recommended to pass DTOs (data transfer objects) between layer boundaries (which is, when you call a method in a web service, you pass the layer boundary).
Regards,
Serge (Logic Software, Easy Projects .NET site)
|
|
|
|
|
I guess one solution is to create the proxy using wsdl.exe. The generated proxy class contains the definitions of the Type1 and Type2 objects. If these are removed and the proxy is made to refer to WSAs types, then the example works.
|
|
|
|
|
I have 2 projects in the same solution, one builds a dll, and the other is a Windows Application.
The application has a project reference to the dll project.
When I select the Project Dependencies of the application, there is the name of the dll and it is checked.
HOWEVER, when I modify the dll, and then build the application, changes are not present in the application.
By now I delete and insert the reference many times and many ways (project reference - in the "Project" tab / assembly reference - in the ".NET" tab) (no pattern noticed yet) until it works. This is getting REALLY annoying.
Can anybody tell me how to make this work out properly?
|
|
|
|
|
Hey I don't know what was going on but now it seems to work.
My 2 projects were not in the same directory... so I did bring the application's development folder where the dll's development folder is... and now it works (for how long?)
still strange...
|
|
|
|
|
Hi, im trying to make a custom control which i can resize and move at Runtime
( a control like when you add a new control to a form in visual studio desinger and you can resize it and move it )
Any help, article, link vould be appreciated, cause im really new to custom controls
thanks
Lique
|
|
|
|
|
Every control can be moved and resized at runtime using the Size and Location property.
www.troschuetz.de
|
|
|
|
|
yes i know that the controls can be resized and moved at runtime by using size and location
but what i want to do is make a label control(example) and draw on its borders 8 small rectangles like
o----o----o
| |
o o
| |
o----o----o
and when i left click on the rectangle to move\resize the control AT runtime
Lique
|
|
|
|
|
Ouh, then I totally misunderstood your question
What you want to do sounds pretty complex and I don't know an easy solution for this.
Try posting this again with the better specification of your question, so maybe someone else can help you.
www.troschuetz.de
|
|
|
|
|
|
Just saying hello, or did you forget your question?
"You can have everything in life you want if you will just help enough other people get what they want." --Zig Ziglar
The Second EuroCPian Event will be in Brussels on the 4th of September
Can't manage to P/Invoke that Win32 API in .NET? Why not do interop the wiki way!
My Blog
|
|
|
|
|
Hi!
... An uncomfortable silence ensues ...
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
I have a dual monitor setup and when I make a RichTextBox control spawn onto both screens and have the font size bigger then 12 I get flickering whenever there is an update coming to the screen. Since this is a trading app and there are quite a few updates a second it can be very rough of your eyes. Is there a way to get rid of the flicker ? Double buffering perhaps ? I've tried updating my video card drivers to no avail. Thanks in advance...
-Peter
|
|
|
|
|
There are several articles dealing with double buffering here on Code Project, which can be easily found by using the article search.
Also there were some posting on flickering and double buffering in this forum earlier today. Use the Next link to get to them.
www.troschuetz.de
|
|
|
|
|
There is a command u can pinvoke to "freeze" painting, that mite help. Sorry I cannot recall it off the top of my head.
top secret xacc-ide 0.0.1
|
|
|
|
|
Hi there,
I'm in a bad situation I think.
I have to do something according to what icon has been set in my notifyicon1.
this is the way I have added the icon to the notifyIcon.
notifyIcon1.Icon = new Icon(GetType(),"red.ico");
I have to fire an event only when the icon is different from red.ico,
How can i do this?
The solution might be simple, but I just can't figure it out
looking forward to your response.
regards
Christian
|
|
|
|
|
The icon should only be used to show the user a status of an internal variable, not as a method of passing data from one part of your program to another. If the icon is red, it's because something else in your application set it that way. A better solution would be to set up a property in your app that sets a value that can be used elsewhere in your app and at the same time changes the icon to reflect the value of that property.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Store another variable elsewhere which tells you which icon is selected. This will also protect you against changes to the icon name, how it's stored, etc.
Stability. What an interesting concept. -- Chris Maunder
|
|
|
|
|
I have been trying to scrape Web pages with code that includes the use of HttpWebRequest, then HttpWebResponse, and initially I am just sending the results to the console to be examined. Much sample code I have seen touts HttpWebRequest->HttpWebResponse as a quick, easy way to retrieve HTML from the internet.
What I have found is that this code retrieves only a certain amount of HTML at the beginning of each page, but not the whole thing (sometimes missing the code I need). Can anyone explain why this is? What sort of additional code would I add to repeat the request for data at the stopping point in order to get the rest of the page?
BluDvl90
|
|
|
|
|