के साथ जेनरेट किए गए फैक्ट्री को कैसे बनाएं I ऑटोफैक को 'जेनरेटेड' फैक्ट्री के साथ बनाने की कोशिश कर रहा हूं जो वास्तविक समय में निर्भरता को एनम पैरामीटर के आधार पर हल करेगा।ऑटोफैक - पैरामीटर
को देखते हुए निम्नलिखित इंटरफेस/वर्गों:
public delegate IConnection ConnectionFactory(ConnectionType connectionType);
public enum ConnectionType
{
Telnet,
Ssh
}
public interface IConnection
{
bool Open();
}
public class SshConnection : ConnectionBase, IConnection
{
public bool Open()
{
return false;
}
}
public class TelnetConnection : ConnectionBase, IConnection
{
public bool Open()
{
return true;
}
}
public interface IEngine
{
string Process(ConnectionType connectionType);
}
public class Engine : IEngine
{
private ConnectionFactory _connectionFactory;
public Engine(ConnectionFactory connectionFactory)
{
_connectionFactory = connectionFactory;
}
public string Process(ConnectionType connectionType)
{
var connection = _connectionFactory(connectionType);
return connection.Open().ToString();
}
}
मैं Autofac उपयोग करने के लिए एक विधि है कि एक पैरामीटर प्राप्त करता है कि कारखाने के कुछ प्रकार उत्पन्न करने के लिए करना चाहते हैं: ConnectionType और सही कनेक्शन रिटर्न वस्तु।
मैं निम्नलिखित पंजीकरण के साथ शुरू किया:
- नाम keyed:
- मेटाडाटा
builder.RegisterType<AutoFacConcepts.Engine.Engine>()
.As<IEngine>()
.InstancePerDependency();
builder.RegisterType<SshConnection>()
.As<IConnection>();
builder.RegisterType<TelnetConnection>()
.As<IConnection>();
मैं तो विभिन्न विकल्पों के साथ TelnetConnection/SshConnection पंजीकरण के साथ खेलना जारी रखा
मुझे पंजीकरण के सही संयोजन को नहीं मिला जो मुझे एक जेनरेट किए गए फैक्ट्री प्रतिनिधि को परिभाषित करने की अनुमति देगा जो सही कनेक्शन ऑब्जेक्ट (कनेक्शन प्रकार टाइप करने के लिए कनेक्शन कनेक्शन के लिए एसएससी कनेक्शन) और कनेक्शन टाइपनेट के लिए टेलनेट कनेक्शन को वापस कर देगा। enum कुंजी के साथ
public class Engine : IEngine
{
private IIndex<ConnectionType, IConnection> _connectionFactory;
public Engine(IIndex<ConnectionType, IConnection> connectionFactory)
{
_connectionFactory = connectionFactory;
}
public string Process(ConnectionType connectionType)
{
var connection = _connectionFactory[connectionType];
return connection.Open().ToString();
}
}
अपने IConnection
कार्यान्वयन और रजिस्टर:
'IIndex' का उपयोग करने का बिंदु मैन्युअल रूप से इस बड़े स्विच मामलों को लिखने से बचने के लिए है ताकि इस तर्क को ऑटोफैक द्वारा नियंत्रित किया जा सके। लंबे समय तक यदि इस प्रकार के कई कन्स्ट्रक्टर तर्क हैं तो यह पूरा कोड बहुत जल्दी गन्दा हो सकता है। – nemesv
यदि ओपी 'Func' के बजाय 'कनेक्शन फ़ैक्टरी' प्रतिनिधि को रखना चाहता है तो निम्नलिखित पंजीकरण कार्य करना चाहिए: 'builder.Register ((सी, पी) => { var type = p.Named ("connectionType"); स्विच (प्रकार) { मामले ConnectionType.Ssh: .... } }) जैसा कि (); 'बिंदु नामित पैरामीटर है नाम '" कनेक्शन टाइप "' प्रतिनिधि घोषणा में पैरामीटर मैच है। –
nemesv
मुझे निश्चित रूप से 'IIndex' नहीं दिमाग है लेकिन फिर मैं हमेशा अपने कंटेनर के रूप में ऑटोफैक रखने पर बहुत उत्सुक हूं! : डी –