|
Thanks for the reply.
I agree that designing a system just to use patterns isn't a great idea, this is why I had trouble working on the original assignment.
I have worked with MVVM, and use it in every mobile app I have made so I'll use it for this one as well.
Thanks for the advice
|
|
|
|
|
I Agree. I always think of Patterns as being mostly useful as you're writing, as you spot situations that match the pattern, rather than being the goal itself.
"If you don't fail at least 90 percent of the time, you're not aiming high enough."
Alan Kay.
|
|
|
|
|
|
I'd like a bit of help with terminology/practices around models and DTO's.
If it makes any difference to the answer, this is a blazor client/webapi server in C#, and there will be a database ORM (likely EF) at some point.
I've got some simple plain object classes that I've been calling Models, and each of these contain the properties for one 'thing' in my application.
Now one part of my UI wants to display data from multiple of these model classes. Now I'm pretty sure you don't want to get all of data from each model and combine on the UI. I'm also pretty sure I can't transfer an anonymous type over a webapi call? Or at least I couldn't easily work with it if I did.
So I think I want to create a second class that has the properties from both the parent classes I want to use, the server part does the combining and transfers that class.
So is this combined class more commonly referred to as a DTO? and that for ease of understanding I should separate that from my main model classes?
Also if I do just want all the data from a model class, I dont need to create a seperate DTO just for that, and its ok to just reuse the model class?
thanks
|
|
|
|
|
DTO stands for "data transfer object", so technically anything you return from your API will be a DTO.
The problem with reusing model classes, particularly if you're using an ORM like Entity Framework, is the navigation properties. For example:
public class Customer
{
public List<Order> Orders { get; set; }
}
public class Order
{
public Customer Customer { get; set; }
public List<OrderLine> Lines { get; set; }
}
public class Product
{
public List<OrderLines> OrderLines { get; set; }
}
public class OrderLine
{
public Order Order { get; set; }
public Product Product { get; set; }
} If you now want to return the details of a single order, that will include the customer, which will include all of the customer's orders. Unless your serializer can handle it, you already have a circular reference.
But it gets worse: each order line will return the product. And each product will return all of the order lines which use it. And those will include the details of the order they're associated with, which will include all of the lines for that order. And each order will return the details of the customer, which will return all of the orders and order lines for that customer.
Pretty soon, you're returning almost everything from your database just to display the details of a single order!
It's usually better to create specific DTOs to represent just the data you want to return, with no circular dependencies. You can use a tool like AutoMapper[^] to simplify mapping between your model classes and your DTOs.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
A DTO (data transfer object) is like a pack animal; it's used to move data around as a convenience; they're not part of the "official" model. A DTO comes to mind (for example) when you have to pass "a lot of parameters"; a DTO class is tidier. It's said they shouldn't have methods, only data; but I see no reason not to have special getters, setters and the like if its convenient
Your EF classes would be considered part of your official model; but a single class is not typically referred to as a model; "entity" maybe. Model data (entities) are typically stored (eg. in a db); DTO's aren't.
And, yes, when you retrieve an entity from EF, you can use it "as is"; bearing in mind that these entities can be in different "states" (attached, detached, modified), depending on you requirements at the time.
And your UI can have multiple / different entities (from different tables); eg. the classic "sales invoice" with header (entity1) and details (entity2); the parent-child relationship.
And data typically gets passed in a web service as XML which you put together as you please (according to spec). see: Data Contracts.
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
modified 11-Nov-20 4:05am.
|
|
|
|
|
And here is why some of us never use EF!
I would normally create a model that reflects the data required by the view (sorry I'm WPF oriented), so a request for order details would populate only the order, item lines and customer details for the order requested and pass the single object to the client.
Never underestimate the power of human stupidity -
RAH
I'm old. I know stuff - JSOP
|
|
|
|
|
I think the WPF model concept is where I was initially coming from, as that still seems a good idea for a Blazor wasm app. Even if the V/VM part is a little different.
The webapi (or a service behind that) can do the translation between what I want to show and EF or any other database interaction.
|
|
|
|
|
I'm working on a busisness app for a client. Right now it's a WPF app. I have the UI layer, the BL, and the DAL. 99% of the BL just passes the call to & from the UI/DAL.
Now, I'm going to be introducing a Tablet piece. In the WPF app's ViewModels I have a Validate method which checks to see if the required fields are filled in, and also some business logic. One example is "You cannnot save a Job if the Approiver has not been set"
So, in the tablet app, I'm going to want to do the same logic.... when the user clicks Save, validate required fields and apply business rules. So It seems to me that the BL is a good place for this.
However, its also seems that passing all the data across the web to a Web API, only to have it rejected in the BL, isn't right.
Is this the right approach?
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
modified 2-Nov-20 15:34pm.
|
|
|
|
|
I'd be inclined to have a shared class library of DTOs used to communicate with the API, and put the validation in there. Then have the UI view-models delegate as much of the validation to the DTO as possible.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Richard Deeming wrote: I'd be inclined to have a shared class library of DTOs used to communicate with the API, and put the validation in there.
That would be fine if the only issue were missing property data. The DTO'scould validate themselves. But in the case of business logic, there are times when you would need to go to the data.
Plus, putting the validation in the logic means that the DTO's can only be used in that app. If you then created another app that uses the same data, then the DTO's are now housing logic specific to the first app. The second app may not require the same validation.
IMHO, DTO's should be dumb objects that do nothing but carry data.
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
It is generally a bad practice not to validate one's data that has been sent via the internet to an API before committing to a repository/database. If the volume of data being transmitted results in a sluggish UI, perhaps the core design is incorrect and should be reevaluated.
|
|
|
|
|
At least three times a day.
That's how often I press a link, button or whatever JUST after it moves to another location to be replaced with something I did not want to press.
It happens on my phone
It happens on my PC on the system tray
It happens in the browser
And other places...
Every morning I must push that icon to log in to the companys VPN in windows system tray. I wait for the icon to load. I wait for the other stuff to load, see my click-target jumping around in the menu. Ok, now everything is loaded, everything is still, I press it...NOOOOOO....JUST then it was replaced by another icon/button for an update of SSMS. I'm late for my morning meeting. The PC freezes for 60 seconds. My head boils....
Reading the morning paper on my phone...same thing....JUST when I press that article it's replaced by a link to an annoying ad (ok, maybe that's not a design flaw, maybe that's meant to be).
Same thing in Visual Studio...wow, it says I can start working while it's loading my project....lets press the file I want to work on.....NOOOOO......JUST THEN....
So: Designers of user interfaces of the world: Please: If you go with that fancy dynamic loading, please see to it that the things already loaded ARE NOT MOVED!
modified 13-Oct-20 4:31am.
|
|
|
|
|
It must be you, that never happens to me.
|
|
|
|
|
Did you have an actual question or did you just sign up to post a rant that everyone is going to ignore?
modified 12-Oct-20 15:01pm.
|
|
|
|
|
It's a good rant, although the Rant button could have been used, and it's already gotten three responses.
|
|
|
|
|
Truth be told, the CP "login" in the top right corner never works for me. It should be modal once you invoke it, but you only get to select your email, them it disappears. Then you do something else instead which I can't remember because I'm still thinking of why no one ever fixed this.
(But thought it must be me)
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
It works correctly for me every time. And the details in the modal popup are saved in the browser's cookies, not on the Codeproject system.
|
|
|
|
|
I think you're "clicking" that link and going to the / a "login" page directly.
If you hover over it, you get a type of login "tooltip" that you then start playing tag with.
If you do manage to tag (focus) it, a drop down will show some emails you can now stab at ... at which point the "login tooltip" disappears before you get to enter a password.
No keys were typed or buttons were pressed. I didn't make this up.
In any event, what's the point of "2" login facilities (the "tooltip" and the page). If you're not seeing the hovering "login tooltip", you're not "doing it right".
(It's only in Edge via Outlook; I'm always automatically logged in on FireFox).
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
modified 13-Oct-20 4:27am.
|
|
|
|
|
No, that's not what I see. I just signed out in order to test it. If I hover over the login at top right the little popup window appears with my email and password filled in. I then click the "sign in" button and I am back here. That has been the case for as long as I remember, using IE, Firefox and Chrome.
|
|
|
|
|
I could produce some "video evidence", but can't see the point. I'm not denying your reality.
(Maybe it's related to my mouse "scroll speed setting" or something ... super fast)
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
Gerry Schmitz wrote: I could produce some "video evidence" I do not disbelieve you, I am merely telling you what happens for me. There may be a million reasons why our experiences are different, but that's just software.
|
|
|
|
|
It's posted in a discussion group and does not need to be a question.
Social Media - A platform that makes it easier for the crazies to find each other.
Everyone is born right handed. Only the strongest overcome it.
Fight for left-handed rights and hand equality.
|
|
|
|
|
You need faster computers.
It happens to me once in a while and yes, it is very annoying. Sometimes it has nothing to do with dynamically added controls, it's just that the browser is taking a while to apply the CSS.
Social Media - A platform that makes it easier for the crazies to find each other.
Everyone is born right handed. Only the strongest overcome it.
Fight for left-handed rights and hand equality.
|
|
|
|
|
It happens to me every time I try to click the Network notification icon or the speaker.
|
|
|
|