# Proposed Project Structure

The Starcounter app project structure is inspired by [the structure of ASP.NET 5 projects](http://gunnarpeipman.com/2014/10/asp-net-5-new-structure-of-solutions-and-projects/). The difference is that ASP.NET has `Controllers`, `Models`, `Scripts`, and `Views` while Starcounter has `Api` handlers, JSON + HTML `viewmodels` and `database` classes.

This tree displays the structure of a Starcounter project:

![](https://3760276903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fstarcounter%2F-KtCfmFRINhj2Ebx1W5P%2F-KtCfo6Bmkx8UJQzxkGr%2FCapture2.PNG?alt=media\&token=81a054f2-2d9b-41ff-882f-f57d4522d0d5)

## Namespaces

`Api`, `Database`, `Helpers`, and `ViewModels` folders may or may not have their own namespace.

A json view model class would look like this:

```csharp
using Starcounter;

namespace StarcounterSample 
{
    public class MainPage : Json 
    {
    }
}
```

A helper file inside `Helpers` folder would look like this:

```csharp
namespace StarcounterSample 
{
    public class StringsHelper 
    {
    }
}
```

A handler file inside `Api` folder would look like this:

```csharp
using Starcounter;

namespace StarcounterSample 
{
    public class MainHandlers 
    {
        public void Register() 
        {
            Handle.GET("/StarcounterSample", () => new MainPage());
        }
    }
}
```

Custom sub-folders and sub-namespaces could be used if needed.

A view page inside sub-folder: `StarcounterSample/ViewModels/Launcher/AppMenuPage.json`.

```csharp
using Starcounter;

namespace StarcounterSample.Launcher 
{
    public class AppMenuPage: Json 
    {
    }
}
```

## C# files & Classes

Name of `.cs` and `.json` files should be exactly the same as classes inside. Name of `.json` and `.json.cs` files should also match.

The correct structure for sign in page would be like this:

* `ViewModels/SignInPage.json`
* `ViewModels/SignInPage.json.cs`
* `class SignInPage : Json`

## Html Page Files

Html files which represent a json view model like `SignInPage.Html` should be named exactly the same as name of json file.

This is correct:

```javascript
{
    "Html": "/GoogleSignIn/views/SignInPage.html"
}
```

And these are incorrect:

```javascript
{
    "Html": "/GoogleSignIn/views/signinpage.html"
}
```

```javascript
{
    "Html": "/GoogleSignIn/views/sign-in-page.html"
}
```

## Custom Elements

The html files which do not represent any of json page should be stored inside `elements` folder. The name of a file should be exactly the same as name of the element inside.

## JavaScript Libraries

Most of the Starcounter applications do not use custom JavaScript libraries outside of WebComponents.\
If you need a custom JavaScript library then it should be scoped to your application and saved inside a `js` folder.

## Startup `Program.cs` Class

* In small applicaions, the startup class may register handlers and make some preparations.
* In big applications, the startup class should be minified and only call `Register` method of `/Api/` classes.

## Visual Studio Files

Visual Studio solution (`sln`) and project (`csproj`, `kproj`) files should be checked in to the version control system.

User preference files (`suo`), which carry information about unloaded projects in a solution or breakpoints in a project, should not be checked in to the version control system.
