I'm using the latest version of Unity, (3.5.1405-prerelease), for injecting dependencies, (three layer architecture).
Project.Web
Application layer, MVC.
App_Start:
public static class UnityWebActivator
{
public static void Start()
{
var container = UnityConfig.GetConfiguredContainer();
FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
public static void Shutdown()
{
var container = UnityConfig.GetConfiguredContainer();
container.Dispose();
}
}
public class UnityConfig
{
#region Unity Container
private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() =>
{
var container = new UnityContainer();
RegisterTypes(container);
return container;
});
public static IUnityContainer GetConfiguredContainer()
{
return container.Value;
}
#endregion
public static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<IAccountService, AccountService>();
container.RegisterType<IAdministrationService, AdministrationService>();
}
}
Project.Business
Business layer, class library. Contains service.
Project.Data
Data layer, class library. Contains repository.
Question
How do I register types for my data layer? Currently it's only registrating Application layer -> Business layer. I dont want to register business layer -> data layer within my application layer.
Update 1 - Example
This is an example for when I want to retrieve a userID from the database.
APPLICATION LAYER:
public class HomeController : Controller
{
private readonly IUserService _userService;
public HomeController(IUserService userService)
{
_userService = userService;
}
[HttpGet]
public ActionResult GetUserID()
{
int userID = _userService.GetUserIDGuest("test@gmail.com");
return View(userID);
}
}
SERVICE LAYER:
public class UserService : IUserService
{
private readonly IUserRepository _userRepository;
public UserService(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public int GetUserIDGuest(string email)
{
return _userRepository.GetUserIDGuest(email);
}
}
DATA LAYER:
public abstract class RepositoryBase
{
protected readonly DataLayer DB;
protected readonly CloudStorageServices Storage;
protected RepositoryBase(DataLayer db, CloudStorageServices storage)
{
DB = db;
Storage = storage;
}
}
public class UserRepository : RepositoryBase, IUserRepository
{
public UserRepository(DataLayer db, CloudStorageServices storage) : base(db, storage) { }
public int GetUserIDGuest(string email)
{
return DB.User.Where(m => m.Email == email.ToLower().Trim() && m is Guest).Select(o => o.UserID).SingleOrDefault();
}
}