masastack / MASA.Framework

.NET next-generation microservice development framework, which provides cloud native best practices based on Dapr.
https://docs.masastack.com/framework/getting-started/overview
MIT License
695 stars 111 forks source link

fix: IgnoreInjection support ImplementationType #698

Closed xiaoxiaotank closed 3 months ago

xiaoxiaotank commented 4 months ago

Description

Look this:

using Microsoft.Extensions.DependencyInjection;

var services = new ServiceCollection();

services.AddAutoInject();

var sp = services.BuildServiceProvider();

var userServices = sp.GetServices<IUserService>();

// We expect to output only UserService1, but it includes UserService2
Console.WriteLine(string.Join(Environment.NewLine, userServices.Select(s => s.ToString())));

public interface IUserService : ITransientDependency { }

public class UserService1 : IUserService { }

[IgnoreInjection]
public class UserService2 : IUserService { }

Issue reference

None

Checklist

Please make sure you've completed the relevant tasks for this PR, out of the following list:

Qinyouzeng commented 4 months ago

这种使用场景一般不存在吧,如果存在多个实现,一般会用构造方法进行区别创建

xiaoxiaotank commented 4 months ago

这种使用场景一般不存在吧,如果存在多个实现,一般会用构造方法进行区别创建

目前没有遇到一个特别适合的场景,但我认为从功能设计上来说,它确实应该支持

xiaoxiaotank commented 4 months ago

之所以想要支持该功能,是因为编写下方代码时会使人产生疑惑:

var services = new ServiceCollection();

services.AddAutoInject();

var sp = services.BuildServiceProvider();

// UserService1
var userServices1 = sp.GetService<UserService1>();
// null
var userServices2 = sp.GetService<UserService2>();

public abstract class UserServiceBase : ITransientDependency { }
public class UserService1 : UserServiceBase { }
[IgnoreInjection]
public class UserService2 : UserServiceBase { }

当服务继承的是类时,userServices2 是可以被忽略的,但是当继承(实现)的是接口时(最上方代码),它却没有被忽略。这很容易让人怀疑人生。