|
Without getting into architectures, you do know you don't need "cloud hosting" in order for people to visit your site? "I would like to host my app in the cloud, so that everyone on the internet can access it."
Cloud hosting of course has advantages (scalability, resilience, potentially performance etc) BUT if you're new to web development, is a large learning curve in its own right. I've been doing web development for 20+ years but both Azure and AWS are so complex to configure, and so unpredictable in terms of pricing (and potentially very very expensive) that to date I've steered clear.
Unless you expect mega take-up of your app, all you need is a basic shared hosting plan with a MySql or SqlServer database, at a cost of under $5 / month in total. It will be much easier to configure and manage, and allow you to concentrate on your application.
Your tech lists above are comparing apples and televisions (not even apples and oranges). Generally, the languages you build your app in are unrelated to the platforms you host on (with some limitations).
|
|
|
|
|
First time poster, long time visitor.
TL/DR: What kind of design patterns are useful for the following project:
Frontend: Web/Mobile, simple Word finding game (4x4 board with 16 letters, connect letters to make words)
Backend + database: Check if word exist/ Save scores for highscore/ Save generated boards/ Users/ etc. (I'm planning to use Repository and Unit of Work for Database, and Singleton for settings, userId, etc.)
Long story:
I'm currently working on the last assignments of my study, and have hit a mental wall for quite some time
One of the assignments is for a class called Design Patterns, where we have to make a drawing program with specific design patterns or use design patterns in a project of our own.
After failing multiple times trying to build the standard assignment, I'm thinking of combining my last two assignments into one, and creating a web-app/mobile-app with backend and database.
Frontend would have a 4x4 board of buttons, with letters on it. The buttons can be tapped and a word can be added.
The backend would check if the word exists, if the word is playable on the
Database will keep highscores, userinfo, earlier generated boards, etc.
I don't know a lot about design patterns, so I was hoping some people with experience could help me with some useful design patterns that I could use. The ones I do know I could use are Repository and Unit of Work for the Database, and Singleton for saving settings and UserId on the mobile app.
|
|
|
|
|
When it comes to web applications, the common UI patterns to apply are some combination of Model View Controller, Model View, ViewModel or Model View Presenter. If I were you, I'd look at what you can do with those. If you have experience with more complicated applications then another common pattern to apply is the use of Observables.
Normally I would advise against designing a system just to use patterns but if your assignment is to use patterns then that's what you are going to have to do.
|
|
|
|
|
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.
|
|
|
|
|