.Net Core 中使用工厂模式

工厂模式是最常用的设计模式之一,属于创建型模式。
有点:

  • 解耦,可以把对象的创建和过程分开
  • 减少代码量,易于维护

当一个抽象类有多个实现的时候,需要多次实例化的时候,就要考虑使用工厂模式。
比如:登录的抽象类 ILoginBusiness,它有2个实现,一个用用户名密码登录,一个用手机号验证码登录

public interface ILoginBusiness
{
    Task Login(LoginInputDTO input);
}

public class MobileCodeLogin : ILoginBusiness
{
    public Task Login(LoginInputDTO input)
    {
        // todo
    }
}

public class UserNameAndPasswordLogin : ILoginBusiness
{
    public Task Login(LoginInputDTO input)
    {
        // todo
    }
}

按照原有方式,我们会根据某个条件去实例化,比如loginType

ILoginBusiness loginBusiness;
if (loginType == 1)
{
    loginBusiness = new MobileCodeLogin();
}
else
{
    loginBusiness = new UserNameAndPasswordLogin()
}

当有多种实例的话,就需要更多的ifelse或者switch,工厂模式的作用就是把这种建造对象的方法放在工厂类去解决,统一管理统一维护。

public interface ILoginFactory
{
    ILoginBusiness Create(LoginInputDTO inputDto);
}

public class LoginFactory : BaseBusiness, ILoginFactory, ITransientDependency
{

    public ILoginBusiness Create(LoginInputDTO inputDto)
    {
        return inputDto.LoginType == LoginType.UserNameAndPwd
            ? AppDependencyResolver.Current.GetService<usernameandpwdlogin>()
            : (ILoginBusiness)AppDependencyResolver.Current.GetService<mobilecodelogin>();

    }

    public LoginFactory(IRepository repository) : base(repository)
    {

    }
}
</mobilecodelogin></usernameandpwdlogin>

如果用new的方法去实例化,就需要把构造方法中的参数在工厂的构造方法里也加入进去,所以这里用了一个 AppDependencyResolver,这里的 AppDependencyResolver.Current.GetService<t></t>是从当前IOC容器中获取注入的实例,所以之前的 MobileCodeLoginUserNameAndPasswordLogin需要注入到IOC实例中,在我们项目就是继承 ITransientDependency

public class AppDependencyResolver
{
    private static AppDependencyResolver _resolver;
    public static AppDependencyResolver Current
    {
        get
        {
            if (_resolver == null)
                throw new Exception("AppDependencyResolver not initialized");
            return _resolver;
        }
    }

    // &#x5728;startUp&#x7684;ConfigureService&#x7684;&#x6700;&#x540E;&#xFF0C;&#x52A0;&#x5165;AppDependencyResolver.Init(services.BuildServiceProvider());
    public static void Init(IServiceProvider service)
    {
        _resolver = new AppDependencyResolver(service);
    }
    private AppDependencyResolver(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }
    private readonly IServiceProvider _serviceProvider;
    public object GetService(Type serviceType)
    {
        return _serviceProvider.GetService(serviceType);
    }
    public T GetService<t>()
    {
        return _serviceProvider.GetService<t>();
    }
}
</t></t>

关于工厂,我们只需要测返回的对象是否是我们需要的就可以了,至于对象的执行对不对不需要关心

[Theory(DisplayName = "&#x6D4B;&#x8BD5;&#x767B;&#x5F55;&#x5DE5;&#x5382;")]
[InlineData(LoginType.MobileCode, typeof(MobileCodeLogin))]
[InlineData(LoginType.UserNameAndPwd, typeof(UserNameAndPwdLogin))]
public void CreateTests(LoginType loginType, Type expectedType)
{
    Mock<irepository> mock = new Mock<irepository>();
    ILoginFactory factory = new LoginFactory(mock.Object);
    var login =  factory.Create(new LoginInputDTO()
    {
        LoginType = loginType
    });
    Assert.IsType(expectedType, login);
}
</irepository></irepository>

Original: https://www.cnblogs.com/inday/p/asp-net-core-factory.html
Author: James.Ying
Title: .Net Core 中使用工厂模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/602363/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球