我正在使用Entity Framework Code-First构建ASP.NET Core MVC应用程序.我选择实现一个简单的存储库模式,为我创建的所有模型类提供基本的CRUD操作.我选择遵循http://docs.asp.net中提供的所有建议,DI就是其中之一.
在.NET 5中,依赖注入非常适用于我们不直接实例化的任何类(例如:控制器,数据存储库,......).
我们只是通过构造函数注入它们,并在应用程序的Startup类中注册映射:
// Some repository class
public class MyRepository : IMyRepository
{
private readonly IMyDependency _myDependency;
public MyRepository(IMyDependency myDependency)
{
_myDependency = myDependency;
}
}
// In startup.cs :
services.AddScoped<IMyDependency, MyDependency>();
services.AddScoped<IMyRepository, MyRepository>();
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,在我的一些模型类中,我想注入一些我声明的依赖项.
但我认为我不能使用构造函数注入模式,因为模型类通常是明确地实现的,因此,我需要为自己提供依赖项,我不能.
所以我的问题是:是否有另一种方式比构造函数注入注入依赖项,以及如何?我是在考虑一个属性模式或类似的东西.
在Asp.Net MVC Core(早期版本,版本1.0或1.1)中,依赖注入绑定在Startup.cs类中配置如下:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IMyService, MyService>();
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,我通常有一个基本的Startup类,其中泛型绑定被定义为这些行的序列:
public abstract class BaseStartup
{
public virtual void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IMyService1, MyService1>();
services.AddScoped<IMyService2, MyService2>();
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的应用程序中,我继承了启动类,并注入了其他服务:
public class Startup : BaseStartup
{
public override void ConfigureServices(IServiceCollection services)
{
base.ConfigureServices(services);
services.AddScoped<IMyService3, MyService3>();
services.AddScoped<IMyService4, MyService4>();
}
}
Run Code Online (Sandbox Code Playgroud)
我现在想知道:我怎样才能"覆盖"以前的绑定?例如,我希望删除或修改基类中定义的绑定,如:
services.Remove<IMyService1>(); // Doesn't exist
services.AddScoped<IMyService1, MyBetterService1>();
Run Code Online (Sandbox Code Playgroud)
或者只是更新绑定:
services.AddScoped<IMyService1, MyBetterService1>(replacePreviousBinding: true); // Doesn't exist either !
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点 ?或者只是简单地声明一个与之前定义的绑定相同的接口的新绑定将覆盖该绑定?
将附加实体的实体附加到现有实体时,我遇到了一个问题(我将现有实体称为数据库中已存在的实体,并正确设置了PK).
问题是使用Entity Framework Core 1.1.0时.这与Entity Framework 7(Entity Framework Core的初始名称)完美配合.
我没有尝试使用EF6或EF Core 1.0.0.
我想知道这是回归,还是故意改变行为.
该模型
该试验模型在于Place,Person和许多一对多通过命名的连接实体广场和人之间的关系PlacePerson.
public abstract class BaseEntity
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Person : BaseEntity
{
public int? StatusId { get; set; }
public Status Status { get; set; }
public List<PersonPlace> PersonPlaceCollection { get; set; } = new List<PersonPlace>();
}
public class Place : BaseEntity
{
public List<PersonPlace> …Run Code Online (Sandbox Code Playgroud) 我已经在iOS7 SDK上以编程方式创建了一个基本应用程序:
这工作正常,一切都以编程方式完成.我的项目只包含一个简单的窗口应用程序模板,没有任何xib或故事板,一切都在我的AppDelegate.m的应用程序didFinishLaunchingWithOptions中完成.
我试图添加一个UISegmentedControl(仍以编程方式)作为第一个UINavigationController视图的子视图,如下所示:
// First navigation controller
UINavigationController *firstNavController = [[UINavigationController alloc] init];
firstNavController.navigationBar.barTintColor = [UIColor redColor];
firstNavController.title = @"First";
firstNavController.navigationBar.topItem.title = @"First top";
firstNavController.tabBarItem.image = [UIImage imageNamed:@"FirstTab"];
// First view
UIView *firstView = [[UIView alloc] init];
firstView.backgroundColor = [UIColor yellowColor];
// Add a segmented control to this view
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:
[NSArray arrayWithObjects:@"One", @"Two", nil]];
// Register an event handler
[segmentedControl addTarget:self action:@selector(segmentedControlSelectedIndexDidChange:)
forControlEvents:UIControlEventValueChanged];
// Shape it and select …Run Code Online (Sandbox Code Playgroud)