2011-12-15 3 views
1

У меня есть консольное приложение с конфигой:Простейшее ват интегрировать Unity с MVC3

<?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), какой способ SIMPLEST для интеграции Unity с MVC3 и работать с моими данными, как указано выше?

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

Спасибо!

Richard

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

EDIT: Работа с предлагаемым ответом.

В 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; 
     } 
    } 
} 

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

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 для работы с объектами домена, не вводя дополнительных зависимостей ... Любые указатели? Действительно, очень ценю.

+0

см. Мое изменение ниже –

ответ

3
  1. Установите пакет Unity.Mvc3 nuget.
  2. перейти к коду загрузчика и добавить отображение (получить его работу, как, что тогда возиться с делать это в конфигурационном файле, если вы так желаете)
  3. загрузчик будет «крючок» в MVC, чтобы это знать разрешение контроллера для использования единства. ex:

    container.RegisterType < ICustomerRepository, CustomerRepository >();

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

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