gpt4 book ai didi

c# - 将抽象工厂与 StructureMap 一起使用的可能性

转载 作者:行者123 更新时间:2023-11-30 18:00:12 30 4
gpt4 key购买 nike

public interface IExecuter
{
void Execute();
}

public class Executer : IExecuter
{
readonly Data _data;
readonly IService _service;

public Executer(Data data, IService service)
{
_data = data;
_service = service;
}

public void Execute()
{
Console.WriteLine("I consume the data object with id {0}", _data.Id);
_service.DoAnything();
}
}

public interface IService
{
void DoAnything();
}

public class Service : IService
{
public void DoAnything()
{
Console.WriteLine("I do anything else");
}
}

public class Data
{
public int Id { get; set; }
public string Description { get; set; }
}

现在我需要一个抽象工厂来创建 IExecuter,因为我需要将运行时值传递给构造函数。

可能性 #1 - 使用静态抽象工厂:

public class FormularWindow
{
public static Func<Data, IExecuter> CreateExecuter = data => {throw new NotImplementedException("");};

public void InvokeExecuter()
{
var selectedData = GetSelectedData();
var executer = CreateExecuter (selectedData);
executer.Execute();
}

private static Data GetSelectedData()
{
return new Data { Id = 4, Description = "Test" };
}
}

class Program
{
static void Main()
{
ObjectFactory.Initialize(x =>
{
x.For<IExecuter>().Use<Executer>();
x.For<IService>().Use<Service>();
});
FormularWindow.CreateExecuter = data => ObjectFactory.With(data.GetType(), data).GetInstance<IExecuter>();

var consumer = ObjectFactory.GetInstance<FormularWindow>();

consumer.InvokeExecuter();

Console.ReadLine();
}
}

可能性 #2 - 使用抽象工厂作为构造函数参数:

public class FormularWindow
{
readonly Func<Data, IExecuter> _createExecuter;

public FormularWindow(Func<Data, IExecuter> createExecuter)
{
_createExecuter = createExecuter;
}

public void InvokeExecuter()
{
var selectedData = GetSelectedData();
var executer = _createExecuter(selectedData);
executer.Execute();
}

private static Data GetSelectedData()
{
return new Data { Id = 4, Description = "Test" };
}
}

class Program
{
static void Main()
{
ObjectFactory.Initialize(x =>
{
x.For<IExecuter>().Use<Executer>();
x.For<IService>().Use<Service>();
x.For<Func<Data, IExecuter>>().Use(data => ObjectFactory.With(data.GetType(), data).GetInstance<IExecuter>());
});


var consumer = ObjectFactory.GetInstance<FormularWindow>();

consumer.InvokeExecuter();

Console.ReadLine();
}
}

可能性 #3 - 使用 IExecuterFactory:

class Program
{
static void Main()
{
ObjectFactory.Initialize(x =>
{
x.For<IExecuter>().Use<Executer>();
x.For<IService>().Use<Service>();
x.For<IExecuterFactory>().Use<ExecuterFactory>();
});

var consumer = ObjectFactory.GetInstance<FormularWindow>();

consumer.InvokeExecuter();

Console.ReadLine();
}
}

public interface IExecuterFactory
{
IExecuter Create(Data data);
}

public class ExecuterFactory : IExecuterFactory
{
readonly IService _service;

public ExecuterFactory(IService service)
{
_service = service;
}

public IExecuter Create(Data data)
{
return new Executer(data, _service);// ?!
}
}


public class FormularWindow
{
readonly IExecuterFactory _executerFactory;


public FormularWindow(IExecuterFactory executerFactory)
{
_executerFactory = executerFactory;
}

public void InvokeExecuter()
{
var selectedData = GetSelectedData();
var executer = _executerFactory.Create(selectedData);
executer.Execute();
}

private static Data GetSelectedData()
{
return new Data { Id = 4, Description = "Test" };
}
}

如您所见,对于可能性#3,我不知道如何实现它。我可以再次使用 FuncExecuterFactory 的构造函数中,但这有点奇怪,因为我在一个抽象工厂中使用了一个抽象工厂

还有 #4 的可能性注入(inject)容器,但这不是一个好主意,因为引入了一个服务定位器

我问自己是否有一种不用 Func<> 来使用抽象工厂的方法?

最佳答案

我不会称之为 Abstract Factory ,它看起来就像某些人所说的简单工厂的功能等价物。

我建议你看看 Mark Seemann 的 post about abstract factories ,他以简单的方式解释了几个选项。

实际上,您可以在 ExecuterFactory 中调用您的容器来解决您的依赖关系,以防它与您的组合根位于同一项目中,或者您自己实例化它们 new您的手动编码工厂。我更喜欢手动方法,因为我喜欢将容器的使用保持在最低限度的想法。

关于c# - 将抽象工厂与 StructureMap 一起使用的可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10330308/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com