我正在使用 ASP.NET Core 2.0
和 Microsoft.Extensions.DependencyInjection
。我有一些类,在这些类中,我不想指定它们的实现或者不需要指定。
例如:
public interface IMyService
{
void WriteSomething();
}
public class MyService : IMyService
{
private readonly MyObject myObject;
public MyService(MyObject myObject)
{
this.myObject = myObject;
}
public void WriteSomething()
{
this.myObject.Write();
}
}
public interface IOther
{
string GetName();
}
public class Other : IOther
{
public string GetName()
{
return "james bond";
}
}
public class MyObject
{
private readonly IOther other;
public MyObject(IOther other)
{
this.other = other;
}
public void Write()
{
Console.WriteLine(string.Concat("hi ", this.other.GetName()));
}
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
...
services.AddScoped<IOther, Other>();
services.AddScoped<IMyService, MyService>();
...
}
}
我想指定只有
IMyToolGeneral
使用MyToolGeneral
,并且只有IOther
使用Other
,但是不指定MyObject
,因为我有很多类似的类(验证器,帮助程序等),而我不需要指定它们。在
ASP.NET Core 2.0
中如何实现?编辑:
我需要
ASP.NET Core 2.0 DI
能够注入一个MyObject
实例,而无需在DI配置中指定它。 MyObject
没有契约(接口)或基类,并且其构造函数中的所有参数都在DI配置中指定。第二次编辑:
我重写了类并在Unity中包含了一个示例(可行),以及在MS DI中包括相同的示例(不可行)。
Unity示例(可行):
class Program
{
static void Main(string[] args)
{
var container = UnityConfig();
var service = container.Resolve<IMyService>();
service.WriteSomething();
Console.ReadKey();
}
static UnityContainer UnityConfig()
{
var container = new UnityContainer();
container.RegisterType<IMyService, MyService>();
container.RegisterType<IOther, Other>();
return container;
}
}
MS DI(不工作) 未处理的异常:System.InvalidOperationException:在尝试激活“ConsoleDI.MyService”时无法解析类型“ConsoleDI.MyObject”的服务。
class Program
{
static void Main(string[] args)
{
var serviceProvider = new ServiceCollection()
.AddTransient<IMyService, MyService>()
.AddTransient<IOther, Other>()
.BuildServiceProvider();
var service = serviceProvider.GetService<IMyService>();
service.WriteSomething();
Console.ReadKey();
}
}
services.AddTransient<MyObject>();
。 - Ivan Milosavljevic