Ecco come di solito realizzo le mie applicazioni a più livelli, in questo caso, utilizziamo un progetto di applicazione Web MVC.
Una libreria di classi, in genere chiamata: ProjectFoo.Domain
:
Ecco dove creo i miei repository astratti per l'accesso ai dati. Ad esempio:
public interface IAccountRepository
{
IEnumerable<Account> FindAll();
}
Creo anche le mie implementazioni concrete qui, uno accede al database reale, l'altro restituisce solo informazioni fittizie:
public class DbAccountRepository : IAccountRepository
{
public IEnumerable<Account> FindAll()
{
DbConnector db = new DbConnector();
return db.Accounts;
}
}
public class MockAccountRepository : IAccountRepository
{
public IEnumerable<Account> FindAll()
{
return new List<Account>(){
new Account { Name = "Sergio", Age = 22 },
new Account { Name = "Brad", Age = 42 },
new Account { Name = "Chelios", Age = 32 },
}
}
}
Successivamente, nel mio progetto di interfaccia utente, in genere chiamato ProjectFoo.WebUI
:
All'interno di un controller uso l'injection dependency per risolvere l'implementazione a cui sto lavorando:
public class AccountController
{
IAccountRepository _accountRepository = new IAccountRepository();
public AccountController(IAccountRepository accountRepository)
{
_accountRepository = accountRepository;
}
public ActionResult Index()
{
// Magic! We don't need to know what exactly we're working against.
var accounts = accountRepository.FindAll();
}
}
Ora sulla tua domanda, How to pass user input from the UI to the BL?
.
Ho scritto la mia interfaccia in questo modo:
public class DbAccountRepository : IAccountRepository
{
// Notice this is the entity object type.
public void AddAccount(Account account)
{
db.AddToAccounts(account);
db.SaveChanges();
}
}
Acquisisci input, modellalo, convalidalo, inseriscilo in un semplice oggetto POCO - una volta che sei sicuro che sia sterilizzato e funzioni correttamente, usa qualcosa come AutoMapper per mappare il tuo oggetto entità e passare l'oggetto completamente caricato lungo la catena verso il tuo repository.
Se hai qualche domanda o non capisci qualcosa fammelo sapere.