Простейшая вата для интеграции Unity с MVC3 - PullRequest
1 голос
/ 15 декабря 2011

У меня есть консольное приложение с конфигурацией:

<?xml version="1.0" encoding="utf-8" ?> <configuration>
    <configSections>
        <section name="unity" type=
           "Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, 
             Microsoft.Practices.Unity.Configuration" />
    </configSections>
    <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
        <assembly name="UnityDi.Contracts" />
        <assembly name="UnityDi.Domain" />
        <assembly name="UnityDi.Services" />
        <assembly name="UnityDi.Repositories" />
        <namespace name="UnityDi.Contracts" />
        <namespace name="UnityDi.Domain" />
        <namespace name="UnityDi.Services" />
        <namespace name="UnityDi.Repositories" />
        <container>
            <register type="IUser" mapTo="User"></register>
            <register type="IUserService" mapTo="UserService"></register>
            <register type="IUserRepository" mapTo="UserRepository"></register>
        </container>
    </unity> 
</configuration>

и Program.cs

namespace UnityDi.Console
{
    using System;
    using Contracts;
    using Microsoft.Practices.Unity;
    using Microsoft.Practices.Unity.Configuration;

    public static class Program
    {
        private static readonly IUnityContainer Container = 
           new UnityContainer().LoadConfiguration();

        public static void Main()
        {
            var dummyUserOne = GetUserReference();

            dummyUserOne.UserId = 1;
            dummyUserOne.FullName = "Bilbo Baggins";

            var dummyUserTwo = GetUserReference();

            dummyUserTwo.UserId = 2;
            dummyUserTwo.FullName = "Frodo Baggins";

            var userService = GetUserServiceReference(); 

            userService.Add(dummyUserOne);
            userService.Add(dummyUserTwo);

            var users = userService.GetAllUsers();

            foreach (var user in users)
            {
                Console.WriteLine(user.FullName);
            }

            Console.ReadLine();
        }

        private static IUser GetUserReference()
        {
            return Container.Resolve<IUser>();
        }

        private static IUserService GetUserServiceReference()
        {
            return Container.Resolve<IUserService>();
        }
    }
}

Это работает очень хорошо.

Я делаюмногие ищут и обнаруживают, что опубликованные решения, интегрирующие Unity с MVC3, кажутся очень многословными в их подходе.

В контексте кода выше (и с требованием сначала подключить код Entity Framework)ПРОСТОЙ способ для меня интегрировать Unity с MVC3 и работать с моими данными, как указано выше?

Я хочу использовать тот же подход к созданию моих объектов в MVC, как и выше.

Спасибо!

Ричард

Ps Самым близким, что я нашел, был Unity.Mvc , но я не могу заставить его работать как выше.Я, вероятно, глуп, хотя.Это ново для меня.

РЕДАКТИРОВАТЬ: Работа с предложенным ответом.

В Web.config для приложения MVC (с добавленным пакетом Unity.Mvc)

[snip]
<container>
    <register type="IUser" mapTo="User"></register>
    <register type="IUserService" mapTo="UserService"></register>
    <register type="IUserRepository" mapTo="UserRepository">
        <lifetime type="HierarchicalLifetimeManager" />
    </register>
</container>

Затем в Bootstrapper.cs

namespace Unity.Mvc.Resources
{
    using System.Web.Mvc;
    using Microsoft.Practices.Unity;
    using Microsoft.Practices.Unity.Configuration;
    using Unity.Mvc3;

    public static class Bootstrapper
    {
        public static void Initialise()
        {
            var container = BuildUnityContainer();

            DependencyResolver.SetResolver(new UnityDependencyResolver(container));
        }

        private static IUnityContainer BuildUnityContainer()
        {
            var container = new UnityContainer().LoadConfiguration();

            container.RegisterControllers();

            return container;
        }
    }
}

Затем в контроллере (момент, когда я понял, что интерфейс может быть любым, о котором знает Unity, включая его собственный):

private readonly IUnityContainer container;

public HomeController(IUnityContainer container)
{
    this.container = container;
}

public ActionResult Index()
{
    var dummyUserOne = GetUserReference();

    dummyUserOne.UserId = 1;
    dummyUserOne.FullName = "Bilbo Baggins";

    var dummyUserTwo = GetUserReference();

    dummyUserTwo.UserId = 2;
    dummyUserTwo.FullName = "Frodo Baggins";

    var userService = GetUserServiceReference();

    userService.Add(dummyUserOne);
    userService.Add(dummyUserTwo);

    var users = userService.GetAllUsers();

    return View(users);
}

private IUser GetUserReference()
{
    return container.Resolve<IUser>();
}

private IUserService GetUserServiceReference()
{
    return container.Resolve<IUserService>();
}

И снова, это работает:)

Это просто оставляет аспект Entity Framework.Нужно настроить DbContext для работы с объектами моего домена, не вводя дополнительных зависимостей ... Есть указатели?Действительно, очень ценится.

1 Ответ

3 голосов
/ 15 декабря 2011
  1. Установите пакет Nuget Unity.Mvc3.
  2. перейдите к коду загрузчика и добавьте свое отображение (настройте его так, а затем возьмите его в конфигурационный файл, если хотите)
  3. Загрузчик «подключится» к mvc, чтобы сообщить о разрешении контроллера для использования единицы.например:

    container.RegisterType();

  4. Любые конструкторы для контроллеров будут искать любые интерфейсы, необходимые для отображения.Если он должен внедрить IService, он будет (пока он знает об этом).Если ему придется повторять этот процесс на всем протяжении захвата объекта (IService требует IRepository и т. Д. Вниз по графику), пока об этом знает единица, он соединит все.

ДляДополнительный вопрос по Entity Framework, я использую класс IContext.Здесь я определяю клиентов IDbSet.Это похоже на эту реализацию: http://leomburke.wordpress.com/category/entity-framework/

...