Bir enum parametresine bağlı olarak bağımlılıkları gerçek zamanlı olarak çözecek bir 'üretilmiş' fabrika Autofac ile oluşturmaya çalışıyorum. Aşağıdaki arayüzler VerilenAutofac - Parametrelerle oluşturulmuş bir fabrika nasıl oluşturulur
/sınıfları:
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();
}
}
Ben bir parametre alır yöntemi vardır fabrikanın çeşit üretmek için AutoFac kullanmak istiyorum: ConnectionType ve doğru bağlantı döndürür nesne.
aşağıdaki kayıtlar başladı:
-
anahtarlı: Sonra farklı seçeneklerle TelnetConnection/SshConnection kayıtları ile oynamaya devam
- Meta veriler
builder.RegisterType<AutoFacConcepts.Engine.Engine>()
.As<IEngine>()
.InstancePerDependency();
builder.RegisterType<SshConnection>()
.As<IConnection>();
builder.RegisterType<TelnetConnection>()
.As<IConnection>();
Doğru bağlantı nesnesini (ConnectionType.Ssh için SshConnection ve ConnectionType.Telnet için TelnetConnection) döndüren bir oluşturulmuş fabrika temsilcisini tanımlamamı sağlayan kayıtların doğru birleşimini bulamadım. enum tuşlarıyla IConnection
uygulamaları
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();
}
}
Ve kayıt: Eğer Paramtre dayalı bir uygulama tipini seçmek gerekiyorsa
' IIndex'in kullanılma noktası, bu büyük anahtarlama durumlarını el ile yazmaktan kaçınmaktır, bu nedenle bu mantık Autofac tarafından ele alınabilir. Uzun vadede bu türlerde birden fazla kurucu argümanı varsa, bu kod oldukça hızlı bir şekilde dağınık olabilir. – nemesv
OP, 'Func' yerine 'ConnectionFactory' delegesini tutmak istiyorsa, aşağıdaki kayıt çalışmalıdır:' builder.Register ((c, p) => { var type = p.Named ("ConnectionType"); anahtarı (tip) { durumda ConnectionType.Ssh: .... } }) .as (); 'noktası adı parametredir '' connectionType ''ismi, temsilci bildirgesindeki parametreyi eşleştiriyor. –
nemesv
Kesinlikle IIndex'i umursamıyorum ama yine de Autofac'i konteyneri olarak tutmaya oldukça hevesliyim! : D –