How To: Manage singletons of similar type in Prism with DI/IoC
Apologies in advance… I’m new to DI/IoC, Prism and it’s been a long 12 hour day!
The project I’m working on must support communications for TcpIp, Bluetooth LE, and (Serial if available). Each connection type will implement IConnection (see below), and a type specific interface (i.e. IBluetoothConnection, ITcpIpConnection, and ISerialConnection) to encapsulate the respective connection parameters. (Baud Rate, Parity, Flow Control, IP Address, Port #, etc…)
public interface IConnection
{
bool Connected { get; }
bool Connect();
bool Disconnect();
bool Tx(string message);
string Rx();
}
public interface IBluetoothLeConnection : IConnection
{
int BaudRate { get; set; }
int Parity { get; set; }
int FlowControl { get; set; }
}
public interface ITcpIpConnection : IConnection
{
string IP { get; set; }
int Port { get; set; }
}
public interface ISerialConnection : IConnection
{
string CommPort { get; set; }
int BaudRate { get; set; }
int Parity { get; set; }
int FlowControl { get; set; }
}
I plan to register all three as singletons.
containerRegistry.RegisterSingleton<IBluetoothConnection, BluetoothLeConnection>();
containerRegistry.RegisterSingleton<ITcpIpConnection, TcpIpConnection>();
containerRegistry.RegisterSingleton<ISeialConnection, SerialConnection>();
Define IConnection Connection in ViewMainBase, and then point it to the chosen concrete connection at runtime.
Questions
Will this work?
Is there a better way (best practice) or (DI/IoC magic) to accomplishing this?
Should I create a ConnectionManager class, and inject all three IConnection types into the constructor and let it manage the active connection?
xamarin dependency-injection xamarin.forms inversion-of-control prism
add a comment |
Apologies in advance… I’m new to DI/IoC, Prism and it’s been a long 12 hour day!
The project I’m working on must support communications for TcpIp, Bluetooth LE, and (Serial if available). Each connection type will implement IConnection (see below), and a type specific interface (i.e. IBluetoothConnection, ITcpIpConnection, and ISerialConnection) to encapsulate the respective connection parameters. (Baud Rate, Parity, Flow Control, IP Address, Port #, etc…)
public interface IConnection
{
bool Connected { get; }
bool Connect();
bool Disconnect();
bool Tx(string message);
string Rx();
}
public interface IBluetoothLeConnection : IConnection
{
int BaudRate { get; set; }
int Parity { get; set; }
int FlowControl { get; set; }
}
public interface ITcpIpConnection : IConnection
{
string IP { get; set; }
int Port { get; set; }
}
public interface ISerialConnection : IConnection
{
string CommPort { get; set; }
int BaudRate { get; set; }
int Parity { get; set; }
int FlowControl { get; set; }
}
I plan to register all three as singletons.
containerRegistry.RegisterSingleton<IBluetoothConnection, BluetoothLeConnection>();
containerRegistry.RegisterSingleton<ITcpIpConnection, TcpIpConnection>();
containerRegistry.RegisterSingleton<ISeialConnection, SerialConnection>();
Define IConnection Connection in ViewMainBase, and then point it to the chosen concrete connection at runtime.
Questions
Will this work?
Is there a better way (best practice) or (DI/IoC magic) to accomplishing this?
Should I create a ConnectionManager class, and inject all three IConnection types into the constructor and let it manage the active connection?
xamarin dependency-injection xamarin.forms inversion-of-control prism
Why areIBluetoothLeConnection
,ITcpIpConnection
, andISeialConnection
interfaces? How are they polymorphic? Will there be more than one implementation of each of them?
– Mark Seemann
Nov 19 '18 at 20:13
Hey @MarkSeemann they are polymorphic as each interface implements IConnection I'll probably implement an abstract base class for IConnetion and subclass the other three from it.
– Sean
Dec 4 '18 at 18:55
IConnection
is already polymorphic. Why do you need further polymorphism?
– Mark Seemann
Dec 4 '18 at 19:11
add a comment |
Apologies in advance… I’m new to DI/IoC, Prism and it’s been a long 12 hour day!
The project I’m working on must support communications for TcpIp, Bluetooth LE, and (Serial if available). Each connection type will implement IConnection (see below), and a type specific interface (i.e. IBluetoothConnection, ITcpIpConnection, and ISerialConnection) to encapsulate the respective connection parameters. (Baud Rate, Parity, Flow Control, IP Address, Port #, etc…)
public interface IConnection
{
bool Connected { get; }
bool Connect();
bool Disconnect();
bool Tx(string message);
string Rx();
}
public interface IBluetoothLeConnection : IConnection
{
int BaudRate { get; set; }
int Parity { get; set; }
int FlowControl { get; set; }
}
public interface ITcpIpConnection : IConnection
{
string IP { get; set; }
int Port { get; set; }
}
public interface ISerialConnection : IConnection
{
string CommPort { get; set; }
int BaudRate { get; set; }
int Parity { get; set; }
int FlowControl { get; set; }
}
I plan to register all three as singletons.
containerRegistry.RegisterSingleton<IBluetoothConnection, BluetoothLeConnection>();
containerRegistry.RegisterSingleton<ITcpIpConnection, TcpIpConnection>();
containerRegistry.RegisterSingleton<ISeialConnection, SerialConnection>();
Define IConnection Connection in ViewMainBase, and then point it to the chosen concrete connection at runtime.
Questions
Will this work?
Is there a better way (best practice) or (DI/IoC magic) to accomplishing this?
Should I create a ConnectionManager class, and inject all three IConnection types into the constructor and let it manage the active connection?
xamarin dependency-injection xamarin.forms inversion-of-control prism
Apologies in advance… I’m new to DI/IoC, Prism and it’s been a long 12 hour day!
The project I’m working on must support communications for TcpIp, Bluetooth LE, and (Serial if available). Each connection type will implement IConnection (see below), and a type specific interface (i.e. IBluetoothConnection, ITcpIpConnection, and ISerialConnection) to encapsulate the respective connection parameters. (Baud Rate, Parity, Flow Control, IP Address, Port #, etc…)
public interface IConnection
{
bool Connected { get; }
bool Connect();
bool Disconnect();
bool Tx(string message);
string Rx();
}
public interface IBluetoothLeConnection : IConnection
{
int BaudRate { get; set; }
int Parity { get; set; }
int FlowControl { get; set; }
}
public interface ITcpIpConnection : IConnection
{
string IP { get; set; }
int Port { get; set; }
}
public interface ISerialConnection : IConnection
{
string CommPort { get; set; }
int BaudRate { get; set; }
int Parity { get; set; }
int FlowControl { get; set; }
}
I plan to register all three as singletons.
containerRegistry.RegisterSingleton<IBluetoothConnection, BluetoothLeConnection>();
containerRegistry.RegisterSingleton<ITcpIpConnection, TcpIpConnection>();
containerRegistry.RegisterSingleton<ISeialConnection, SerialConnection>();
Define IConnection Connection in ViewMainBase, and then point it to the chosen concrete connection at runtime.
Questions
Will this work?
Is there a better way (best practice) or (DI/IoC magic) to accomplishing this?
Should I create a ConnectionManager class, and inject all three IConnection types into the constructor and let it manage the active connection?
xamarin dependency-injection xamarin.forms inversion-of-control prism
xamarin dependency-injection xamarin.forms inversion-of-control prism
edited Nov 13 '18 at 12:43
Sean
asked Nov 12 '18 at 23:03
SeanSean
354
354
Why areIBluetoothLeConnection
,ITcpIpConnection
, andISeialConnection
interfaces? How are they polymorphic? Will there be more than one implementation of each of them?
– Mark Seemann
Nov 19 '18 at 20:13
Hey @MarkSeemann they are polymorphic as each interface implements IConnection I'll probably implement an abstract base class for IConnetion and subclass the other three from it.
– Sean
Dec 4 '18 at 18:55
IConnection
is already polymorphic. Why do you need further polymorphism?
– Mark Seemann
Dec 4 '18 at 19:11
add a comment |
Why areIBluetoothLeConnection
,ITcpIpConnection
, andISeialConnection
interfaces? How are they polymorphic? Will there be more than one implementation of each of them?
– Mark Seemann
Nov 19 '18 at 20:13
Hey @MarkSeemann they are polymorphic as each interface implements IConnection I'll probably implement an abstract base class for IConnetion and subclass the other three from it.
– Sean
Dec 4 '18 at 18:55
IConnection
is already polymorphic. Why do you need further polymorphism?
– Mark Seemann
Dec 4 '18 at 19:11
Why are
IBluetoothLeConnection
, ITcpIpConnection
, and ISeialConnection
interfaces? How are they polymorphic? Will there be more than one implementation of each of them?– Mark Seemann
Nov 19 '18 at 20:13
Why are
IBluetoothLeConnection
, ITcpIpConnection
, and ISeialConnection
interfaces? How are they polymorphic? Will there be more than one implementation of each of them?– Mark Seemann
Nov 19 '18 at 20:13
Hey @MarkSeemann they are polymorphic as each interface implements IConnection I'll probably implement an abstract base class for IConnetion and subclass the other three from it.
– Sean
Dec 4 '18 at 18:55
Hey @MarkSeemann they are polymorphic as each interface implements IConnection I'll probably implement an abstract base class for IConnetion and subclass the other three from it.
– Sean
Dec 4 '18 at 18:55
IConnection
is already polymorphic. Why do you need further polymorphism?– Mark Seemann
Dec 4 '18 at 19:11
IConnection
is already polymorphic. Why do you need further polymorphism?– Mark Seemann
Dec 4 '18 at 19:11
add a comment |
1 Answer
1
active
oldest
votes
Will this work?
Yes.
Is there a better way (best practice) or (DI/IoC magic) to accomplishing this?
I'd refactor the ref
parameter from Rx
into something else because it's not easily mockable when you're writing your tests using a framework like Moq.
Should I create a ConnectionManager class, and inject all three IConnection types into the constructor and let it manage the active connection?
Yes.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53271364%2fhow-to-manage-singletons-of-similar-type-in-prism-with-di-ioc%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Will this work?
Yes.
Is there a better way (best practice) or (DI/IoC magic) to accomplishing this?
I'd refactor the ref
parameter from Rx
into something else because it's not easily mockable when you're writing your tests using a framework like Moq.
Should I create a ConnectionManager class, and inject all three IConnection types into the constructor and let it manage the active connection?
Yes.
add a comment |
Will this work?
Yes.
Is there a better way (best practice) or (DI/IoC magic) to accomplishing this?
I'd refactor the ref
parameter from Rx
into something else because it's not easily mockable when you're writing your tests using a framework like Moq.
Should I create a ConnectionManager class, and inject all three IConnection types into the constructor and let it manage the active connection?
Yes.
add a comment |
Will this work?
Yes.
Is there a better way (best practice) or (DI/IoC magic) to accomplishing this?
I'd refactor the ref
parameter from Rx
into something else because it's not easily mockable when you're writing your tests using a framework like Moq.
Should I create a ConnectionManager class, and inject all three IConnection types into the constructor and let it manage the active connection?
Yes.
Will this work?
Yes.
Is there a better way (best practice) or (DI/IoC magic) to accomplishing this?
I'd refactor the ref
parameter from Rx
into something else because it's not easily mockable when you're writing your tests using a framework like Moq.
Should I create a ConnectionManager class, and inject all three IConnection types into the constructor and let it manage the active connection?
Yes.
answered Nov 13 '18 at 6:28
HaukingerHaukinger
5,5442723
5,5442723
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53271364%2fhow-to-manage-singletons-of-similar-type-in-prism-with-di-ioc%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Why are
IBluetoothLeConnection
,ITcpIpConnection
, andISeialConnection
interfaces? How are they polymorphic? Will there be more than one implementation of each of them?– Mark Seemann
Nov 19 '18 at 20:13
Hey @MarkSeemann they are polymorphic as each interface implements IConnection I'll probably implement an abstract base class for IConnetion and subclass the other three from it.
– Sean
Dec 4 '18 at 18:55
IConnection
is already polymorphic. Why do you need further polymorphism?– Mark Seemann
Dec 4 '18 at 19:11