Unity DI N层架构 - 注册类型业务>数据

时间:2015-10-04 09:36:51

标签: asp.net .net asp.net-mvc dependency-injection unity-container

我正在使用最新版本的Unity(3.5.1405-prerelease),用于注入依赖项,(三层架构)。

Project.Web

应用层,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

业务层,类库。包含服务。

Project.Data

数据层,类库。包含存储库。

  

问题

     

如何为数据层注册类型?目前它是唯一的   注册应用层 - &gt;业务层。我不想   注册业务层 - &gt;我的应用程序层中的数据层。

更新1 - 示例

这是我想从数据库中检索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();
    }
}

1 个答案:

答案 0 :(得分:1)

在我提供的示例中,我认为服务层是一组简单的类,它们将存在于ASP.NET站点的相同进程/应用程序中(即它不是一个完整的应用程序,它自己运行处理)。

这意味着您的服务层不会自行构成应用程序。

您应该在ASP.NET应用程序的Composition Root注册所有内容(例如IUserServiceIUserRepositoryDataLayerCloudStorageServices),即使这意味着您的应用程序将引用所有其他类库。

这很好,应用程序本身需要引用所有内容,它将拼图的各个部分组合在一起。

类库不应该引用所有内容,只引用包含它们依赖的抽象或其他类型的其他类库。

引用我引用的文章(撰写根):

  

只有应用程序应具有组合根。图书馆和框架不应该。