-
Notifications
You must be signed in to change notification settings - Fork 6
ASP.NET Core
Follow these steps to use CoreDdd in ASP.NET Core MVC application (tested with Visual Studio 2017 and .NET Core 2.1):
- Create a new ASP.NET Core MVC project.
- Install following nuget packages into the project:
- CoreDdd
- CoreDdd.Nhibernate
- CoreDdd.AspNetCore
- CoreDdd.Register.DependencyInjection
- CoreDdd.Nhibernate.Register.DependencyInjection
- Add a new empty NHibernate configurator class, example:
public class CoreDddSampleNhibernateConfigurator : NhibernateConfigurator
{
protected override Assembly[] GetAssembliesToMap()
{
return new Assembly[0];
}
}- Add a new NHibernate config file hibernate.cfg.xml . Here is SQLite example:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.connection_string">Data Source=CoreDddSampleAspNetCoreWebApp.db</property>
<property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
<property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property>
<property name="connection.release_mode">on_close</property>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="show_sql">false</property>
<property name="proxyfactory.factory_class">NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate</property>
<property name="transaction.use_connection_on_system_prepare">false</property> <!-- set transaction.use_connection_on_system_prepare to 'false' when using .NET 4.6.1+, NHibernate 5+, more info here https://github.com/npgsql/npgsql/issues/1985#issuecomment-397266128 -->
</session-factory>
</hibernate-configuration>Set hibernate.cfg.xml Build Action to Content, and Copy to Output Directory to Copy if newer.
- Install System.Data.SQLite.Core nuget package. Version 1.0.108 needs to be manually installed via command
Install-Package System.Data.SQLite.Core -Version 1.0.108from Package Manager Console (Tools -> Nuget Package Manager -> Package Manager Console; current latest version 1.0.109.1 is broken). For different databases, please look at Entity database persistence. - Add the following code into
Startup.ConfigureServices()to register CoreDdd services into Dependency Injection:
services.AddCoreDdd();
services.AddCoreDddNhibernate<CoreDddSampleNhibernateConfigurator>();- To handle each request within ADO.NET transaction, add the following code into
Startup.Configure():
app.UseMiddleware<UnitOfWorkDependencyInjectionMiddleware>(IsolationLevel.ReadCommitted);To handle each request within TransactionScope with ADO.NET connection enlisted in the transaction scope, use the following code :
Action<TransactionScope> transactionScopeEnlistmentAction = transactionScope =>
{
// enlist custom resource manager into the transaction scope
};
app.UseMiddleware<TransactionScopeUnitOfWorkDependencyInjectionMiddleware>(
IsolationLevel.ReadCommitted,
transactionScopeEnlistmentAction
);The code above is available as a sample ASP.NET Core MVC application here. The sample application also contains ShipController with methods to create a new Ship aggregate root domain entity, query ships by name and update ship data. Once command handlers, query handlers and domain event handlers are added to the application, they needs to be registered into the Dependency Injection (add Scrutor nuget package to be able to Scan for components):
// register command handlers, query handlers and domain event handlers
services.Scan(scan => scan
.FromAssemblyOf<Ship>()
.AddClasses(classes => classes.AssignableTo(typeof(ICommandHandler<>)))
.AsImplementedInterfaces()
.WithTransientLifetime()
.AddClasses(classes => classes.AssignableTo(typeof(IQueryHandler<>)))
.AsImplementedInterfaces()
.WithTransientLifetime()
.AddClasses(classes => classes.AssignableTo(typeof(IDomainEventHandler<>)))
.AsImplementedInterfaces()
.WithTransientLifetime()
);You can check out other wiki pages how to persist an entity, query data, modify an application state or create more complex DDD implementation.