используйте Castle windsor для создания объекта вместо фабричного класса - PullRequest
2 голосов
/ 21 февраля 2012

хорошо, поэтому у меня есть базовый тип:

ProductBase

, а затем у меня есть несколько продуктов:

Product1: ProductBase

Product2: ProductBase

Product3: ProductBase

Затем заводской класс:

public class productFactory
    {
        public productBase GetProduct(Enums.product buildProduct)
        {

            var outProduct = new ProductBase();
            switch (buildProduct)
            {
                case Enums.Products.Product1:
                    outMis = new Product1();
                    break;

                case Enums.Products.Product2:
                    outMis = new Product2();
                    break;

                default:
                    outMis = new Product1();
                    break;

            }

            return outProduct;
        }
    }

Я знаю, что Виндзор может это сделать, я знаю, что это хорошо.

Насколько я вижу, productBase должен быть интерфейсом с продуктами, реализующими его, но тогда мне нужно сделать их через переключатель enum в windsor?

Справка и указатели (ссылки) ценится.Это в проекте MVC.net 3, и у меня есть виндзорная настройка для контроллеров и логирования, так что этот бит я получаю - хотя, очевидно, огромный пробел в моем понимании IoC и DI!

Один из способов сделать этоэто вместо продукта ProductFactory

собираюсь ответить на мой собственный вопрос - отсюда: http://codeblitz.wordpress.com/2009/05/06/using-factory-method-pattern-with-systemactivator/

вместо использования productFactory:

public class productFactory
{
    public static MisProduct CreateProduct(Enums.Product productType)
    {
        string assemblyName = Assembly.GetExecutingAssembly().GetName().Name;
        //creates an instance based on the enum name 
        ProductBase myProduct = Activator.CreateInstance(
            null,
            string.Format("{0}.Models.Products.{1}", assemblyName, productType)
            ).Unwrap() as ProductBase;
        if (myProduct == null)
        {
            //todo throw an Exception here.
        }
        return myProduct;
    }
}

большекто-нибудь предложения?

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

Я предлагаю вам Типизированная фабрика

Вы можете разрешить необходимый конкретный тип по идентификатору или самому типу, это зависит от того, как вы получаете параметр, который помогает сделать конкретный выбор.

Исходя из вашего примера, перечислитель может быть связан с идентификатором компонента.

0 голосов
/ 22 февраля 2012

Как насчет использования что-то вроде этого:

public class ProductFactory
{
    public T Create<T>() where T : ProductBase, new()
    {
        return new T();
    }
}

Но я думаю, что ваш вопрос не имеет ничего общего с внедрением зависимостей.

Edit: Если вам нужно использовать замок для создания продуктов, вы можете использовать что-то вроде этого:

public interface IProductFactory
{
    T Create<T>() where T : ProductBase, new();
    void Destroy(ProductBase obj)
}

public class ProductFactory : IProductFactory
{
    private readonly WindsorContainer _container;

    public ProductFactory(WindsorContainer container)
    {
         _container = container;
    }

    public T Create<T>() where T : ProductBase, new()
    {
        return _container.Resolve<T>();
    }

    public void Destroy(ProductBase obj)
    {
        _container.Release(obj);
    }
}

Вам необходимо зарегистрировать IProductFactory в ProductFactory, и он должен работать. Извините, если они содержат некоторые ошибки в коде, но у меня сейчас нет Visual Studio, чтобы проверить это.

...