WCF:如何使用依赖注入和抽象工厂?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (172)

我有这个WCF方法

Profile GetProfileInfo(string profileType, string profileName)

规则:

如果profileType是A则从数据库读取。

如果profileType是“B”,则从XML文件中读取。

如何使用依赖注入容器实现它?

提问于
用户回答回答于

首先假设您有一个IProfileRepository,如下所示:

public interface IProfileRepository
{
     Profile GetProfile(string profileName);
}

以及两个实现:DatabaseProfileRepositoryXmlProfileRepository...。问题是,您希望根据profileType的值选择正确的值。

你可以通过介绍抽象工厂:

public interface IProfileRepositoryFactory
{
    IProfileRepository Create(string profileType);
}

假设IProfileRepositoryFactory已经注入到服务实现中,那么现在可以实现GetProfileInfo方法,如下所示:

public Profile GetProfileInfo(string profileType, string profileName)
{
    return this.factory.Create(profileType).GetProfile(profileName);
}

IProfileRepositoryFactory的具体实现如下所示:

public class ProfileRepositoryFactory : IProfileRepositoryFactory
{
    private readonly IProfileRepository aRepository;
    private readonly IProfileRepository bRepository;

    public ProfileRepositoryFactory(IProfileRepository aRepository,
        IProfileRepository bRepository)
    {
        if(aRepository == null)
        {
            throw new ArgumentNullException("aRepository");
        }
        if(bRepository == null)
        {
            throw new ArgumentNullException("bRepository");
        }

        this.aRepository = aRepository;
        this.bRepository = bRepository;
    }

    public IProfileRepository Create(string profileType)
    {
        if(profileType == "A")
        {
            return this.aRepository;
        }
        if(profileType == "B")
        {
            return this.bRepository;
        }

        // and so on...
    }
}
用户回答回答于
    public class ProfileRepositoryFactory : IProfileRepositoryFactory
    {
        public IProfileRepository Create(string profileType)
        {
            switch(profileType)
            {
                case "A":
                    return new DatabaseProfileRepository(); 

                case  "B":
                    return new XmlProfileRepository();
            }
        }
    }

抽象工厂是更高级的模式,用于在不指定具体类的情况下创建相关或依赖对象的系列。可用的UML类图,参考这里。

扫码关注云+社区

领取腾讯云代金券