-
-
Notifications
You must be signed in to change notification settings - Fork 19
/
code_placement.txt
45 lines (43 loc) · 3.02 KB
/
code_placement.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Joinrpg.Helpers
misc. helpers that have no depedency on anything project-specific
Joinrpg.DataModel
Data model. Classes w/o any logic or data access, but used to generate database schema.
Please ask LEO for review when you add/remove new field.
If you like to put some logic into entity, create extension method in Joinrpg.Domain
You can implement IValidatableObject interface that will be checked before every save to database. But remember, DB constraints is always better!
JoinRpg.CommonUI.Models
Contain view models classes that we like to share between UI implementations. For now, it will be only web and email sending, but in future, we'll use it to
share view models between web and mobile clients, for example.
Joinrpg.Data.Interfaces
Interfaces that represent repositories.
If you want just read some data, use IXXXRepository from here.
Try to use as specific method as possible to eliminate lazy loads.
JoinRpg.Data.Write.Interfaces
Contains IUnitOfWork interface that you should use to modify something. Should be used only from inside services.
JoinRpg.Services.Interfaces
Services are business logic code. 1 method = 1 user action = 1 transaction.
JoinRpg.Services.Impl
Implementation of services. Contain most business logic code. Do not trust your input, ask for currentUserId, check rights yourself.
Encapsulate read operations (aside of selecting by primary key) inside repositories.
JoinRpg.Services.Export
Exporter of table data. Converts IEnumerable<AnyObject> to .xslx byte stream, using System.ComponentModel.DataAnnotations. Do not know nothing about JoinRpg
specifics. Uses pluggable backends, now uses ClosedXML to generate .xslx. Can be improved and used as component of it own sometime later.
JoinRpg.Services.Email
Email service put aside in a separate project. If you got especially large service, you can put it in your own project.
JoinRpg.Web
Web site. Should contain only UI. Please put a least logic as possible. Best variant is "get something from repository, transform to viewModel, return View"
or "read and validate parameters, call service, redirect".
JoinRpg.Web\Controllers — 1 method of Controller corresponds to 1 web page. Remember to return Task<ActionResult>, not ActionResult!
JoinRpg.Web\Models — ViewModels. Should be logic-less.
JoinRpg.Web\Views — Templates
JoinRpg.Web\Views\Shared — shared/partial templates
JoinRpg.Web\Views\Shared\DisplayTemplates — used when you are DisplayFor(model => model.ComplexObject)
JoinRpg.Web\Views\Shared\EditorTemplates — used when you are EditorFor(model => model.ComplexObject)
Joinrpg.Dal.Impl
Implementation of DataAccess, repositories, etc. Not be referenced from anywhere.
Localization
============
For now we don't want to spend time localizing. But rule is:
- JoinRpg.Web can contain (for now) user-visible strings
- JoinRpg.Services.Email can contain (for now) user-visible strings
- All other projects SHOULD not contain any user-visible strings and should be localization-neutral. Use TODO[Localize] whenever you break this rule