决定在实践中感受 Autofac。但是没有足够的知识来使用它。该项目很简单,基于使用串行端口。创建了一个模型
public class SerialPortSettings
{
public string Port { get; set; }
public int BaudRate { get; set; }
public int DataBits { get; set; }
public Parity Parity { get; set; }
public StopBits StopBits { get; set; }
public string ThreadControl { get; set; }
public int ReadTimeOut { get; set; }
public SerialPortSettings()
{
// Инициализация свойств и присвоение настроек порта
}
}
界面
public interface ISerialPortService
{
void SetPort();
void WriteData(string msg);
bool OpenPort();
bool ClosePort();
}
实施(我不会包括整个班级以节省空间)
public class SerialPortService : ISerialPortService, IDisposable
{
private SerialPortSettings _portSettings;
private SerialPort _comPort;
public TransmissionType CurrentTransmissionType { get; set; }
public string RecievedText { get; set; }
public string PortStatus { get; set; }
public event DataRecievedEventHandler DataChanged;
public delegate void DataRecievedEventHandler(object sender, string package);
public SerialPortService()
{
_portSettings = new SerialPortSettings();
_comPort = new SerialPort();
_comPort.DataReceived += comPort_DataReceived;
}
好吧,在缅因州,我只使用 SerialPortService 对象
class Program
{
static SerialPortService portService = new SerialPortService();
static void Main(string[] args)
{
portService.OpenPort();
Console.WriteLine(portService.PortStatus);
Console.WriteLine(portService.RecievedText);
Console.ReadKey();
portService.ClosePort();
}
我创建了一个单独的类来设置 Autogac,在这里我不明白如何正确设置整个事情(或者我可能已经做对了所有事情)。
public class AutofacSetup
{
public static void ConfigureContainer()
{
var builder = new ContainerBuilder();
builder.RegisterType<SerialPortService>()
.As<ISerialPortService>();
builder.Build();
}
}
下一步该怎么做?
您需要返回方法的结果
Build():现在您可以使用容器从中获取服务:
看看程序简化了多少?(这是讽刺)
要真正从 Autofac 中受益,您需要有具有依赖关系的类。许多具有依赖关系的类。到目前为止,您只有 1 个没有任何依赖关系的类,因此 Autofac 的好处是值得怀疑的。
我还提醒您,在正常架构中,构建的容器不应离开 Composition Root 的限制(您很可能使用 Main 方法作为 Composition Root)。
代替
在线上:
并在 Main 添加对 autofac 的调用。它将抽象接口 ISerialPortService 替换为 portService 中 SerialPortService 的具体实现。
一般来说,我更喜欢保持 Main 清洁 - 因此,我会从中取出应用程序的所有逻辑,只留下 autofac 调用:
看下一个回答中的ConfigureContainer代码,同样的东西我就不改了。