У меня есть несколько вопросов относительно некоторых лучших практик, когда дело доходит до 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 (..)' , Любые советы будут высоко оценены.
Я в замешательстве, почему вы вводите модели просмотра в свой контроллер? – Brad
Его просто возвращаемый объект, так ужасное имя на моем конце. Я отредактирую это, чтобы никого не путать. Кроме того, не знал, как наилучшим образом справиться с этим, так как я немного новичок в DI. Я старался избегать использования «новых» в любом месте. – user3726393