2016-06-02 4 views
0

У меня есть несколько вопросов относительно некоторых лучших практик, когда дело доходит до Injection Dependency и Web Api. Я использую Autofac, но я думаю, что это будет одинаково независимо от IoC. Это очень общий пример, но я не могу логически думать о том, как лучше всего связать все приложение. В моем коде AppControls всегда зависит от класса Control. Ниже приведены мои фрагменты кода:Web Api и Injection Dependency

AutofacConfig:

public static void Register(HttpConfiguration config) 
{ 

    // Create builder 
    var builder = new ContainerBuilder(); 

    // Register your Web API controllers. 
    builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

    // Register types 
    builder.RegisterType<AppContents>().As<IAppContents>(); 
    builder.RegisterType<AppControls>().As<IAppControls>(); 
    builder.RegisterType<Control>().As<IControl>(); 

    // Set the dependency resolver to be Autofac. 
    var container = builder.Build(); 
    config.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

} 

AppController:

public class AppController : ApiController 
{ 

    private readonly IAppContents _appContents = null; 

    public AppController(IAppContents appContents) 
    { 
     if (appContents == null) 
      throw new ArgumentNullException("appContents"); 
     _appContents = appContents; 
    } 

    public IAppContents Get() 
    { 
     return _appContents; 
    } 
} 

AppContents/IAppContents

public class AppContents : IAppContents 
{ 

    public AppContents(IAppControls appControls) 
    { 
     if (appControls == null) 
      throw new ArgumentNullException("appControls"); 
     AppControls = appControls; 
    } 

    public IAppControls AppControls { get; set; } 
} 

public interface IAppContents 
{ 
    IAppControls AppControls { get; set; } 
} 

AppControls/IAppControls

public class AppControls : IAppControls 
{ 

    public AppControls() 
    { 

     ////////////////////////////////// 
     // Tightly coupled 
     ///////////////////////////////// 

     // Controls1 
     var controls1 = new List<IControl>(); 
     controls1.Add(new Control("Control1", "1", null)); 
     controls1.Add(new Control("Control2", "2", null)); 
     controls1.Add(new Control("Control3", "3", null)); 
     Controls1 = controls1; 

     // Controls2 
     var controls2 = new List<IControl>(); 
     controls2.Add(new Control("Control1", "1", null)); 
     controls2.Add(new Control("Control2", "2", null)); 
     controls2.Add(new Control("Control3", "3", null)); 
     Controls2 = controls2; 

     // Controls3 
     var controls3 = new List<IControl>(); 
     controls3.Add(new Control("Control1", "1", null)); 
     controls3.Add(new Control("Control2", "2", null)); 
     controls3.Add(new Control("Control3", "3", null)); 
     Controls3 = controls3; 

    } 

    public IEnumerable<IControl> Controls1 { get; set; } 
    public IEnumerable<IControl> Controls2 { get; set; } 
    public IEnumerable<IControl> Controls3 { get; set; } 
} 

public interface IAppControls 
{ 
    IEnumerable<IControl> Controls1 { get; set; } 
    IEnumerable<IControl> Controls2 { get; set; } 
    IEnumerable<IControl> Controls3 { get; set; } 
} 

Control/IControl

public class Control : IControl 
{ 

    public Control(string text, string value, string group) 
    { 
     Text = text; 
     Value = value; 
     Group = group; 
    } 

    public string Text { get; set; } 
    public string Value { get; set; } 
    public string Group { get; set; } 
} 

public interface IControl 
{ 
    string Group { get; set; } 
    string Text { get; set; } 
    string Value { get; set; } 
} 

Независимо от того, как я могу думать об этом, у меня всегда будет называть 'новый Control (..)' , Любые советы будут высоко оценены.

+0

Я в замешательстве, почему вы вводите модели просмотра в свой контроллер? – Brad

+0

Его просто возвращаемый объект, так ужасное имя на моем конце. Я отредактирую это, чтобы никого не путать. Кроме того, не знал, как наилучшим образом справиться с этим, так как я немного новичок в DI. Я старался избегать использования «новых» в любом месте. – user3726393

ответ

1

Injection Dependency упрощает управление зависимостями между объектами. Поэтому проще разбить связную функциональность на отдельные контракты (интерфейсы) и, таким образом, решить проблему замены зависимостей объектов во время выполнения или времени компиляции. Это не значит, что вам больше никогда не придется что-то повторять.

В вашем случае контроллеру не нужно беспокоиться о том, как создать экземпляр IAppContents, который, в свою очередь, не должен знать об IAppControls (отсутствие «новых AppContents»).

Однако IControl выглядит как некая форма статических данных, без поведения, поэтому он больше похож на newable than an injectable. Обычный сценарий для IAppControls заключался бы в том, чтобы инжектор обработал, через который вы могли бы где-нибудь прочитать эти данные.

Это, как говорится, вам не нужна свободная связь для внедрения инъекции зависимостей. Вы можете ввести конкретный экземпляр Control без создания абстрактной версии вашей модели - если вы не планируете ее замену с помощью аналогичных, но изменяющихся моделей управления (например, во время модульного тестирования).