繁体   English   中英

Castle.Windsor-如何实现TypedFactoryFacility

[英]Castle.Windsor - How to implement TypedFactoryFacility

最近,我使用工厂模式开发了一个component。 但是,我做了研究。 关于如何使用TypedFactoryFacility进行改进,因为我们使用的是Castle.WIndsor。

您能否提供一个简单的完整示例? 我读的很少,但仍然不能完全理解。 到目前为止,我的代码看起来像这样:

public class DynamoStoreService : IDynamoStoreService 
{
    private IDynamoStoreFactory _dynamoStoreFactory;
    public DynamoStoreService(IDynamoStoreFactory dynamoStoreFactory)
    {
        _dynamoStoreFactory=dynamoStoreFactory;
    }

    public IDynamoStore GetProductDataDynamoStore(string storageAccount)
    {
        return _dynamoStoreFactory.Create(storageAccount);
    }
}

public class DynamoStoreFactory : IDynamoStoreFactory
{
    private IStorageAccountSelector _storageAccountSelector;

    public DynamoStoreFactory(IStorageAccountSelector storageAccountSelector)
    {
        _storageAccountSelector = storageAccountSelector;
    }

    public IDynamoStore Create(string storageAccount)
    {
        return new AzureKeyValueStore(_storageAccountSelector.GetCredentials(storageAccount).StorageAccount, "pointerfiles");
    }
}

public class StorageAccountSelector : IStorageAccountSelector
{
    private readonly IConfigurationSettings _settings;
    public StorageAccountSelector(IConfigurationSettings settings)
    {
        _settings = settings;
    }

    BlobCredentials IStorageAccountSelector.GetCredentials(string storageAccount)
    {
        return new BlobCredentials()
        {
            Container = string.Empty,
            StorageAccount = GetStorageAccount(storageAccount)
        };
    }

    private string GetStorageAccount(string storageAccount)
    {
        switch (storageAccount)
        {
            case "CustomerPolarisingCategoryBlobStorageAccountKey":
                return _settings.CustomerPolarisingCategoryBlobStorageAccount;
            case "CustomerPolarisingSegmentBlobStorageAccountKey":
                return _settings.CustomerPolarisingSegmentBlobStorageAccount;
            case "P2ProductSimilarityBlobStorageAccountKey":
                return _settings.P2ProductSimilarityBlobStorageAccount;
            case "ProductPolarisingCategoryBlobStorageAccountKey":
                return _settings.ProductPolarisingCategoryBlobStorageAccount;
            case "ProductPolarisingSegmentBlobStorageAccountKey":
                return _settings.ProductPolarisingSegmentBlobStorageAccount;
            case "SignalBlobStorageAccountKey":
                return _settings.SignalBlobStorageAccount;
        }
        return string.Empty;
    }
}

}

因此,基本上来说,当IDynamostore调用时,我们需要能够传递不同的连接字符串。 我已经弄清楚了上面的设计..可以使用TypedFactoryFacility进行改进吗?

谢谢

也许下面的代码可以使您了解如何使用TypedFactoryFacility。 如果您已经研究过并且有疑问,请告诉我。

亲切的问候,Marwijn。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Castle.Facilities.TypedFactory;
using Castle.MicroKernel;
using Castle.MicroKernel.Registration;
using Castle.Windsor;

namespace ConsoleApplication3
{
    public class TypedFactoryComponentSelector : DefaultTypedFactoryComponentSelector
    {
        private readonly StorageAccountSelector _storageAccountSelector;

        public TypedFactoryComponentSelector(StorageAccountSelector storageAccountSelector)
        {
            _storageAccountSelector = storageAccountSelector;
        }

        protected override System.Collections.IDictionary GetArguments(MethodInfo method, object[] arguments)
        {
            var dictionary = new Dictionary<string, object>();

            dictionary.Add("mappedStorageAccount", _storageAccountSelector.GetCredentials((string)arguments[0]).StorageAccount);
            dictionary.Add("files", "pointerfiles");

            return dictionary;
        }
    }

    public interface IDynamoStore
    {
    }

    public class AzureKeyValueStore : IDynamoStore
    {
        public AzureKeyValueStore(string mappedStorageAccount, string files)
        {
            Console.WriteLine(mappedStorageAccount);
            Console.WriteLine(files);
        }
    }

    public class BlobCredentials
    {
        public string Container { get; set; }
        public string StorageAccount { get; set; }
    }


    public interface IDynamoStoreFactory
    {
        IDynamoStore Create(string storageAccount);
    }

    public class StorageAccountSelector
    {

        public BlobCredentials GetCredentials(string storageAccount)
        {
            return new BlobCredentials()
            {
                Container = string.Empty,
                StorageAccount = GetStorageAccount(storageAccount)
            };
        }

        public string GetStorageAccount(string storageAccount)
        {
            return storageAccount + "Mapped";
            return string.Empty;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var container = new WindsorContainer();
            container.AddFacility<TypedFactoryFacility>();

            container.Register(
                Component.For<IDynamoStoreFactory>().AsFactory(new TypedFactoryComponentSelector(new StorageAccountSelector())),
                Component.For<IDynamoStore>().ImplementedBy<AzureKeyValueStore>()
            );

            var factory = container.Resolve<IDynamoStoreFactory>();
            factory.Create("storageAccount");
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM