我正在使用最新版本的Unity(3.5.1405-prerelease),用于注入依赖项,(三层架构)。
应用层,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>();
}
}
业务层,类库。包含服务。
数据层,类库。包含存储库。
问题
如何为数据层注册类型?目前它是唯一的 注册应用层 - &gt;业务层。我不想 注册业务层 - &gt;我的应用程序层中的数据层。
这是我想从数据库中检索userID的示例。
申请层:
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);
}
}
服务层:
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();
}
}
答案 0 :(得分:1)
在我提供的示例中,我认为服务层是一组简单的类,它们将存在于ASP.NET站点的相同进程/应用程序中(即它不是一个完整的应用程序,它自己运行处理)。
这意味着您的服务层不会自行构成应用程序。
您应该在ASP.NET应用程序的Composition Root注册所有内容(例如IUserService
,IUserRepository
,DataLayer
和CloudStorageServices
),即使这意味着您的应用程序将引用所有其他类库。
这很好,应用程序本身需要引用所有内容,它将拼图的各个部分组合在一起。
类库不应该引用所有内容,只引用包含它们依赖的抽象或其他类型的其他类库。
引用我引用的文章(撰写根):
只有应用程序应具有组合根。图书馆和框架不应该。