Category: .NET

My Async Await tutorials

Rule of thumb: just await / async from top to down.

 

To deeply understand async await in .NET Core , please follow the following resources:

 

1. https://channel9.msdn.com/Events/TechDays/Techdays-2014-the-Netherlands/Async-programming-deep-dive  – to gain inner knowledge about what code is async / await

2. Read https://blog.stephencleary.com/2012/02/async-and-await.html to have started into async await

3. Read MSDN for a better understanding : https://msdn.microsoft.com/en-us/magazine/jj991977.aspx?f=255&MSPPError=-2147217396

4. Common pitfalls in ASP.NET  Framework( not in console! ) with async await: https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

5. No problem in ASP.NET Core: https://blog.stephencleary.com/2017/03/aspnetcore-synchronization-context.html

Happy reading !

Connections strings to config

I have the opportunity to work on some pretty old code . There were many projects , all that had a sort of connection string to the database.  This kind of code were in like > 11 places :

string connectionstring = “Data Source=.\\SqlServer;Initial Catalog=myDB;Integrated Security=SSPI;”;

The task was to modify this in something that could read from a config ( json) file . But more than that, was to verify
1.that is called everywhere – because sometimes it were in methods, other time in a static variable and so on .
2. that the json exists or not ( if not return the default string – but log the fact that are not in the settings)

So – how to monitor that your code is actually hit ? One idea is to make breakpoints. Other is to make a class:

So I came up with this class

public class ConnectionSql
{
public ConnectionSql(
[CallerMemberName] string memberName = "",
[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0)
{

Trace.WriteLine("member name: " + memberName);
Trace.WriteLine("source file path: " + sourceFilePath);
Trace.WriteLine("source line number: " + sourceLineNumber);
}
//TODO: if need speed, make this static - or strConnection...
public string ConnectionString()
{
var strConnection = ConfigurationManager.AppSettings["sql"];
if (string.IsNullOrWhiteSpace(strConnection))
{
Console.WriteLine("not found connection sql string in settings , going to default");
strConnection = ".\\SqlServer;Initial Catalog=myDB;Integrated Security=SSPI;";
}
return strConnection;

}

}

 

How we call ?


string connectionstring = new ConnectionSql().ConnectionString();

 

Because of the attributes https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/caller-information we can figure by looking at the trace if the code was hit or not and by which line.

Circular references on .NET , Entity Framework and WebAPI

Imagine having a class Department( ID, Name) and Employee ( ID , Name, IDDepartment) . You want to return in the WebAPI the Departments with the Employee . It is simple to wrote this code:


[HttpGet]
public IEnumerable<Department> Get([FromServices] MyTestDatabaseContext context)
{
var departments = context.Department.Include(iterator=>iterator.Employee).ToArray();
return departments;
}

But the problem is with circular references when serializing  : The Department has a list of  Employees  that have a Department that have a list of Employees that …

 

 

Solution 1 :  Delete/Comment from the EF generated code what you do not need ( in this case , the Department reference that the Employee has)


public partial class Employee
{
public int Idemployee { get; set; }
public string NameEmployee { get; set; }
public int Iddepartment { get; set; }

//public Department IddepartmentNavigation { get; set; }
}

Solution 2 : Nullify the reference


[HttpGet]
public IEnumerable<Department> Get([FromServices] MyTestDatabaseContext context)
{
var departments = context.Department.Include(iterator=>iterator.Employee).ToArray();
foreach (var dep in departments)
{
foreach (var emp in dep.Employee)
{
emp.IddepartmentNavigation = null;
}
}
return departments;
}

( maybe this should be add to the partial class of the employee ?)

 

 

Solution 3: Handle circular references in serialization


services
.AddMvc()
.AddJsonOptions(opt =>
{
opt.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
opt.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
});

Solution 4: Make a read DDD design. Read https://siderite.blogspot.com/2018/08/client-models-vs-data-transfer-objects.html

Interpreter–part 7 of n–thank you

In our days you cannot build a project without help from other projects.  So it is your project – it is build on the shoulder of others( https://en.wikipedia.org/wiki/Standing_on_the_shoulders_of_giants )

Add a third party notice and thanks others that contributes with components to your project.

I have discovered https://github.com/KrystianKolad/DotnetThx  – and running it gives me that :

—————————————————————
Package:InterpreterDll
Page:https://github.com/ignatandrei/interpreter
Andrei Ignat
—————————————————————
—————————————————————
Package:McMaster.Extensions.CommandLineUtils
Page:https://github.com/natemcmaster/CommandLineUtils
Nate McMaster
—————————————————————
—————————————————————
Package:McMaster.Extensions.CommandLineUtils-max
Page:https://github.com/natemcmaster/CommandLineUtils-max
Nate McMaster
—————————————————————
—————————————————————
Package:McMaster.Extensions.CommandLineUtils-max2
Page:https://github.com/natemcmaster/CommandLineUtils-max2
Nate McMaster
—————————————————————
—————————————————————
Package:CommandLine.Core.CommandLineUtils
Page:https://github.com/mthamil/CommandLine.Core
Matt Hamilton
—————————————————————
—————————————————————
Package:CommandLineUtils.Extensions
Page:https://github.com/mthamil/CommandLine.Core
Matt Hamilton
—————————————————————
—————————————————————
Package:FormatWith
Page:https://github.com/crozone/FormatWith
Ryan Crosby
—————————————————————
—————————————————————
Package:netfx-System.StringFormatWith
Page:http://netfx.codeplex.com/
Henri Wiechers,  Daniel Cazzulino,  kzu,  Clarius
—————————————————————
—————————————————————
Package:netfx-System.StringFormatWith.Tests
Page:http://netfx.codeplex.com/
Henri Wiechers,  Daniel Cazzulino,  kzu,  Clarius
—————————————————————
—————————————————————
Package:DocumentFormat.OpenXml
Page:https://github.com/OfficeDev/Open-XML-SDK
Microsoft
—————————————————————
—————————————————————
Package:ZXing.Net
Page:https://github.com/micjahn/ZXing.Net/
Michael Jahn
—————————————————————
—————————————————————
Package:Google.Protobuf
Page:https://github.com/google/protobuf
Google Inc.
—————————————————————
—————————————————————
Package:ExcelNumberFormat
Page:https://github.com/andersnm/ExcelNumberFormat
ExcelNumberFormat developers
—————————————————————
—————————————————————
Package:NUnit.Runners
Page:http://nunit.org/
Charlie Poole
—————————————————————
—————————————————————
Package:WebP.Touch
Page:https://github.com/molinch/WebP.Touch
Daniel Luberda, Molinet Fabien, Cosmin Gordea
—————————————————————
—————————————————————
Package:BclContrib-ParseFormat
Page:http://code.google.com/p/bclcontrib-parseformat/
Sky Morey
—————————————————————
—————————————————————
Package:SmartFormat.NET
Page:https://github.com/scottrippey/SmartFormat.NET
Scott Rippey,axuno gGmbH,Bernhard Millauer and other contributors.
—————————————————————
—————————————————————
Package:SFD.StringFormat
Page:
AdamSpeight2008
—————————————————————
—————————————————————
Package:ActionMessageFormat
Page:https://github.com/mntone/Data.Amf
mntone and qwerty
—————————————————————
—————————————————————
Package:FileFormatWavefront
Page:https://github.com/dwmkerr/file-format-wavefront
Dave Kerr
—————————————————————
—————————————————————
Package:String.Format.Js
Page:http://mstr.se/sffjs
Daniel Mester Pirttijärvi
—————————————————————
—————————————————————
Package:ActionMessageFormat.UWP
Page:https://github.com/tor4kichi/Data.Amf
tor4kichi
—————————————————————
—————————————————————
Package:jQuery.dateFormat
Page:https://github.com/phstc/jquery-dateFormat
Pablo Cantero
—————————————————————
—————————————————————
Package:TMU-BioTextMining.i2b2.Format
Page:https://sites.google.com/site/hongjiedai/projects/tmuclinicalnet
Hong-Jie Dai
—————————————————————
—————————————————————
Package:Estat.Sri.Ws.Format.Sdmx
Page:https://webgate.ec.europa.eu/CITnet/stash/projects/SDMXRI/repos/nsiws.net/browse
Eurostat
—————————————————————
—————————————————————
Package:FormatProviders
Page:
AdamSpeight2008
—————————————————————
—————————————————————
Package:Microsoft.CodeAnalysis.CSharp
Page:https://github.com/dotnet/roslyn
Microsoft
—————————————————————
—————————————————————
Package:Microsoft.CodeAnalysis.CSharp.Workspaces
Page:https://github.com/dotnet/roslyn
Microsoft
—————————————————————
—————————————————————
Package:Microsoft.CodeAnalysis.CSharp.Scripting
Page:https://github.com/dotnet/roslyn
Microsoft
—————————————————————
—————————————————————
Package:Microsoft.CodeAnalysis.CSharp.Features
Page:https://github.com/dotnet/roslyn
Microsoft
—————————————————————
—————————————————————
Package:Microsoft.CodeAnalysis.CSharp.Extensions
Page:https://github.com/denis-tsv/Microsoft.CodeAnalysis.CSharp.Extensions
Denis Tsvettsih
—————————————————————
—————————————————————
Package:Sawmill.Microsoft.CodeAnalysis.CSharp
Page:https://github.com/benjamin-hodgson/Sawmill
benjamin.hodgson
—————————————————————
—————————————————————
Package:Forked-MS.CodeAnalysis.CSharp-KeywordAlias
Page:https://github.com/rickardp/roslyn
Rickard
—————————————————————
—————————————————————
Package:Roslynator.CodeFixes
Page:http://github.com/JosefPihrt/Roslynator
Josef Pihrt
—————————————————————
—————————————————————
Package:Roslynator.Analyzers
Page:http://github.com/JosefPihrt/Roslynator
Josef Pihrt
—————————————————————
—————————————————————
Package:Ben.Demystifier-RoslynScriptingCompatibility
Page:https://github.com/molinch/Ben.Demystifier-RoslynScriptingCompatibility
ben_a_adams molinch
—————————————————————
—————————————————————
Package:Microsoft.CodeAnalysis.Compilers
Page:https://github.com/dotnet/roslyn
Microsoft
—————————————————————
—————————————————————
Package:Microsoft.CodeAnalysis
Page:https://github.com/dotnet/roslyn
Microsoft
—————————————————————
—————————————————————
Package:Microsoft.CodeAnalysis.Workspaces.MSBuild
Page:https://github.com/dotnet/roslyn
Microsoft
—————————————————————
—————————————————————
Package:Microsoft.CodeAnalysis.CSharp.Scripting
Page:https://github.com/dotnet/roslyn
Microsoft
—————————————————————
—————————————————————
Package:Ben.Demystifier-RoslynScriptingCompatibility
Page:https://github.com/molinch/Ben.Demystifier-RoslynScriptingCompatibility
ben_a_adams molinch
—————————————————————
—————————————————————
Package:Newtonsoft.Json
Page:https://www.newtonsoft.com/json
James Newton-King
—————————————————————
—————————————————————
Package:Amplified.ValueObjects.Newtonsoft.Json
Page:https://github.com/Nillerr/Amplified.ValueObjects
Nicklas Jensen
—————————————————————
—————————————————————
Package:CommonSerializer.Newtonsoft.Json
Page:https://github.com/BrannonKing/CommonSerializer
Brannon King
—————————————————————
—————————————————————
Package:Remote.Linq.Newtonsoft.Json
Page:https://github.com/6bee/Remote.Linq
Christof Senn
—————————————————————
—————————————————————
Package:aqua-core-newtonsoft-json
Page:https://github.com/6bee/aqua-core
Christof Senn
—————————————————————
—————————————————————
Package:RestSharp.Newtonsoft.Json.NetCore
Page:https://github.com/Alterdata/RestSharp.Newtonsoft.Json.NetCore
Bernardo Esbérard
—————————————————————
—————————————————————
Package:Newtonsoft.Json.FSharp
Page:
Henrik Feldt,  Logibit AB
—————————————————————
—————————————————————
Package:Orleans.Serialization.Newtonsoft.Json
Page:https://github.com/OrleansContrib/orleans.serialization.json
Daniel Marbach
—————————————————————
—————————————————————
Package:Newtonsoft.Json.Net20.dll
Page:
wx1983@gmail.com
—————————————————————
—————————————————————
Package:Sfa.Core.Newtonsoft.Json
Page:https://github.com/SkillsFundingAgency/Core
Skills Funding Agency
—————————————————————
—————————————————————
Package:NServiceBus.Newtonsoft.Json
Page:https://docs.particular.net/nuget/NServiceBus.Newtonsoft.Json
Particular Software
—————————————————————
—————————————————————
Package:RestSharp.Newtonsoft.Json
Page:https://github.com/adamfisher/RestSharp.Serializers.Newtonsoft.Json
Adam Fisher
—————————————————————
—————————————————————
Package:Bridge.Newtonsoft.Json
Page:https://github.com/bridgedotnet/Bridge.Newtonsoft.Json
Object.NET, Inc.
—————————————————————
—————————————————————
Package:Gu.SerializationAsserts.Newtonsoft.Json
Page:https://github.com/JohanLarsson/Gu.SerializationAsserts
Johan Larsson
—————————————————————
—————————————————————
Package:RestSharp.Newtonsoft.Json.Extensions
Page:https://github.com/i4004/RestSharp.Newtonsoft.Json.Extensions
Alexander Krylkov
—————————————————————
—————————————————————
Package:Mgazza.Newtonsoft.Json
Page:https://github.com/mgazza/Optional
Mark Gascoyne
—————————————————————
—————————————————————
Package:Newtonsoft.Json.Akshay
Page:
Akshay.Shingnapurkar, Yuvraj.Repe
—————————————————————
—————————————————————
Package:WampSharp.NewtonsoftJson
Page:https://wampsharp.net/
CodeSharp
—————————————————————
—————————————————————
Package:Pollock.Newtonsoft.Json
Page:
wallymathieu
—————————————————————
—————————————————————
Package:Lykke.WampSharp.NewtonsoftJson
Page:https://github.com/LykkeCity/WampSharp
Lykke
—————————————————————
—————————————————————
Package:coverlet.msbuild
Page:http://github.com/tonerdo/coverlet
tonerdo
—————————————————————
—————————————————————
Package:Microsoft.CodeAnalysis.CSharp.Scripting
Page:https://github.com/dotnet/roslyn
Microsoft
—————————————————————
—————————————————————
Package:Ben.Demystifier-RoslynScriptingCompatibility
Page:https://github.com/molinch/Ben.Demystifier-RoslynScriptingCompatibility
ben_a_adams molinch
—————————————————————
—————————————————————
Package:Microsoft.NET.Test.Sdk
Page:https://github.com/microsoft/vstest/
Microsoft
—————————————————————
—————————————————————
Package:MSTest.TestAdapter
Page:https://github.com/microsoft/testfx
Microsoft
—————————————————————
—————————————————————
Package:MSTestX.TestAdapter
Page:https://github.com/dotMorten/MSTestX
Morten Nielsen
—————————————————————
—————————————————————
Package:MSTest.TestFramework
Page:https://github.com/microsoft/testfx
Microsoft
—————————————————————
—————————————————————
Package:MSTest.TestFramework
Page:https://github.com/microsoft/testfx
Microsoft
—————————————————————
—————————————————————
Package:MSTest.TestAdapter
Page:https://github.com/microsoft/testfx
Microsoft
—————————————————————
—————————————————————
Package:Microsoft.UnitTestFramework.Extensions
Page:https://github.com/Microsoft/mstest-extensions/wiki
Microsoft
—————————————————————
—————————————————————
Package:Nosnitor.TestFramework.Extensions.MSTest
Page:
Nosnitor Corporation
—————————————————————
—————————————————————
Package:Riganti.Selenium.MSTest2Integration
Page:https://github.com/riganti/selenium-utils
Ladislav Šesták
—————————————————————
—————————————————————
Package:LightBDD.MsTest2
Page:https://github.com/LightBDD/LightBDD
Wojciech Kotlarski
—————————————————————
—————————————————————
Package:Shouldly
Page:http://shouldly.github.com/
Shouldly
—————————————————————
—————————————————————
Package:Sollertes.Bdd.Shouldly
Page:https://github.com/Sollertes/BDD
Marcin Markowski
—————————————————————
—————————————————————
Package:ITLibrium.BDD.Shouldly
Page:https://github.com/itlibrium/BDD
Marcin Markowski
—————————————————————
—————————————————————
Package:Mgazza.Shouldly
Page:https://github.com/mgazza/Optional
Mark Gascoyne
—————————————————————
—————————————————————
Package:Shouldly.EqualityExtensions
Page:https://github.com/whortleberrybearer/shouldly
whortleberrybearer
—————————————————————
—————————————————————
Package:NorwegianShouldly
Page:https://github.com/eaardal/norwegian-shouldly
This language wrapper: Eirik Årdal. Original Shouldly: See Shouldly NuGet package

A whole bunch of packages – that it is clear that helps my project.

Obtain data from ANAF(local IRS)

In ROmania ANAF is providing a WebAPI that allows access to some of the information that any enterprise should provide. The API is described at https://webservicesp.anaf.ro/PlatitorTvaRest/api/v3/ ,

I have made a C# console and a node,js script.

The differences:

1.it is easiear in node to make an http request.

2. For C# – I think in components. For node – I think in application.

Without further ado, here is the code

using RestSharp;
using System;

namespace InfoAnafWS
{
    class Program
    {
        static void Main(string[] args)
        {
            if(args.Length == 0)
            {
                Console.WriteLine("lipseste CUI ");
                return;
            }
            var client = new RestClient("https://webservicesp.anaf.ro");
            var request = new RestRequest("PlatitorTvaRest/api/v3/ws/tva", Method.POST);
            request.RequestFormat = DataFormat.Json;
            string date = DateTime.Now.AddDays(-5).ToString("yyyy-MM-dd");
            string req = "";
            foreach (var item in args)
            {
                req += string.Format(@"{{'cui': {1}, 'data':'{0}'}}", date, item);
            }
            req = req.Replace("'", "\"");
            req = "[" + req + "]";

            request.AddParameter("application/json", req, ParameterType.RequestBody);
            var data = client.Execute(request);
            Console.WriteLine(data.Content);
        }
    }
}


const start = async () => {
	
let request = require('request');

const d = require('delay');
await d(1000);
var fs = require('fs');
var array = fs.readFileSync('CUI.txt').toString().split("\r\n");
var start=0;

while(start<array.length){
	var nr = Math.floor(Math.random() * Math.floor(495))+1;
	var jsonData=[];
	console.log('start at ' + start+  ' for nr ' + nr);
	var i=0;
	while(i<nr && i+start<array.length){
		jsonData.push({"cui": array[i+start], "data":"2018-03-26"});
		i++;		
	}
	
	var finish=false;
	console.log('array :'+ jsonData[0].cui + '-'  + jsonData[nr-1].cui);
	request.post(
    'https://webservicesp.anaf.ro/PlatitorTvaRest/api/v3/ws/tva',
    { json: jsonData },
    function (error, response, body) {
		finish=true;
        if (!error && response.statusCode == 200) {
            console.log(body);
			fs.writeFile(`text${start}_${nr}.json`, JSON.stringify( body ), function (err) {
            if (err) {
                return console.log(err);
            }

            console.log("The file was saved!" + `text${start}_${nr}.json`);
        });

        }
    });
	start = start+nr;
	while(!finish){
		console.log('waiting');
		await d(13000);
	}
	

}
console.log('finish')
return;

}
start();

Tiny Types–documentation–part 4

This is a series

  1. http://msprogrammer.serviciipeweb.ro/2018/03/12/tiny-types-in-cpart-1/
  2. http://msprogrammer.serviciipeweb.ro/2018/03/19/tiny-types-part-2adding-iequatable/
  3. http://msprogrammer.serviciipeweb.ro/2018/03/26/tinytypesadding-equality-operatorpart-3/

  4. http://msprogrammer.serviciipeweb.ro/2018/04/02/tiny-typesdocumentationpart-4/

tiny types in C#

Build Status

Tiny types is a NuGET dll , https://www.nuget.org/packages/TinyTypesObjects/

Also , you can find the construction here: http://msprogrammer.serviciipeweb.ro/category/tinytypes/

The documentation is copied shameless from https://github.com/jan-molak/tiny-types

Installation

To install the module from nuget : … Install-Package TinyTypesObjects …

Defining Tiny Types

An int on its own is just a scalar with no meaning. With an object, even a small one, you are giving both the compiler and the programmer additional information about what the value is and why it is being used.

Jeff Bay, Object Calisthenics

Single-value types

To define a single-value TinyType – extend from TinyType<T>() :

If you want operator ==, please use TinyTypeOf or TinyTypeOfString

using TinyTypesObjects;

public class Age : TinyTypeOf<int>
    {
        public Age(int nr) : base(nr)
        {

        }
    }
public class FirstName : TinyTypeOfString
    {
        public FirstName(string str) : base(str)
        {

        }
    }

Every tiny type defined this way has a get property value of type T, which you can use to access the wrapped primitive value. For example:

var firstName = new FirstName("Jan");

Assert.AreEqual(firstName.value , "Jan");
        
Converting from / to original values

There are defined conversions between type T and the class

public void TestConvert()
        {
            string s = "http://msprogrammer.serviciipeweb.ro";
            TinyTypeOfString tt = s;
            Assert.AreEqual(s, (string)tt);

            int nr = 7;
            TinyTypeOf<int> tt1 = nr;

            Assert.AreEqual(nr, (int)tt1);
        }
        

so the following code should work for the class with constructor string

class TestConstructor
    {
        public TestConstructor(string firstName)
        {
            FirstName = firstName;
        }

        public string FirstName { get; }
    }
[TestMethod]
        public void TestConstructor()
        {
            var firstName = new FirstName("Jan");
            TestConstructor tc = new TestConstructor(firstName);
            Assert.AreEqual(tc.FirstName, "Jan");
        }
Equals or ==

Each tiny type object has an equals method, which you can use to compare it by value:

int nr = 7;
            TinyTypeOf<int> tt1 = nr;
            TinyTypeOf<int> tt2 = nr;

            Assert.AreEqual(tt1, tt2);
            Assert.IsTrue(tt1 == tt2);
Links:

GitHub: https://github.com/ignatandrei/tinyTypes

Blog About: http://msprogrammer.serviciipeweb.ro/category/tinytypes/

NuGet: https://www.nuget.org/packages/TinyTypesObjects/

TinyTypes–adding equality operator–part 3

This is a series

  1. http://msprogrammer.serviciipeweb.ro/2018/03/12/tiny-types-in-cpart-1/
  2. http://msprogrammer.serviciipeweb.ro/2018/03/19/tiny-types-part-2adding-iequatable/
  3. http://msprogrammer.serviciipeweb.ro/2018/03/26/tinytypesadding-equality-operatorpart-3/

  4. http://msprogrammer.serviciipeweb.ro/2018/04/02/tiny-typesdocumentationpart-4/

Now we have come to the interesting part – the equality operator.

We have already operator equals, but not ==

 [TestMethod]
        public void TestSimpleIntOperatorEqual()
        {
            int nr = 7;
            TinyType<int> tt1 = nr;
            TinyType<int> tt2 = nr;

            Assert.AreEqual(tt1, tt2);
            Assert.IsFalse(tt1 == tt2);
        }
        [TestMethod]
        public void TestSimpleStringOperatorEqual()
        {
            string s = "http://msprogrammer.serviciipeweb.ro";
            TinyType<string> tt1 = s;
            TinyType<string> tt2 = s;

            Assert.AreEqual(tt1, tt2);
            Assert.IsFalse(tt1 == tt2);
        }

Because we primary want this TinyTypes for structs( int, double, bool, and so on) we can define a new class

For this we could implement operator  ==  by using the Equals operator ( because we KNOW that a struct cannot be null)

public class TinyTypeOf<T> : TinyType<T>
        where T:struct
    {
        public TinyTypeOf(T tDef) : base(tDef)
        {
        }

       
        public static bool operator ==(TinyTypeOf<T> lhs, TinyTypeOf<T> rhs)
        {
            if(lhs is null)
            {
                return rhs is null;
            }
            return lhs.t.Equals(rhs.t);
        }

        public static bool operator !=(TinyTypeOf<T> lhs, TinyTypeOf<T> rhs)
        {
            return !(lhs==rhs);
        }

CODE FOR NEW CLASS

Also, because the string is not a struct, but a class, we need for String also:

public class TinyTypeOfString : TinyType<string>

And the tests are

using Microsoft.VisualStudio.TestTools.UnitTesting;
using TinyTypesObjects;

namespace TinyTypesTest
{
    [TestClass]
    public class TestTinyTypeOperatorEqual
    {
        [TestMethod]
        public void TestSimpleIntOperatorEqual()
        {
            int nr = 7;
            TinyType<int> tt1 = nr;
            TinyType<int> tt2 = nr;

            Assert.AreEqual(tt1, tt2);
            Assert.IsFalse(tt1 == tt2);
        }
        [TestMethod]
        public void TestSimpleStringOperatorEqual()
        {
            string s = "http://msprogrammer.serviciipeweb.ro";
            TinyType<string> tt1 = s;
            TinyType<string> tt2 = s;

            Assert.AreEqual(tt1, tt2);
            Assert.IsFalse(tt1 == tt2);
        }
        [TestMethod]
        public void TestSimpleStringOperatorEqualWorks()
        {
            string s = "http://msprogrammer.serviciipeweb.ro";

            TinyTypeOfString tt1 = s;
            TinyTypeOfString tt2 = s;

            Assert.AreEqual(tt1, tt2);
            Assert.IsTrue(tt1 == tt2);
        }

        [TestMethod]
        public void TestSimpleIntOperatorEqualWorks()
        {
            int nr = 7;
            TinyTypeOf<int> tt1 = nr;
            TinyTypeOf<int> tt2 = nr;

            Assert.AreEqual(tt1, tt2);
            Assert.IsTrue(tt1 == tt2);
        }
        [TestMethod]
        public void TestSimpleIntNrOperatorEqualWorks()
        {
            int nr = 7;
            TinyType<int> tt1 = nr;
            
            Assert.AreEqual(tt1, nr);
            Assert.IsTrue(tt1 == nr);
        }
    }
}

Tiny Types part 2–adding IEquatable

This is a series

  1. http://msprogrammer.serviciipeweb.ro/2018/03/12/tiny-types-in-cpart-1/
  2. http://msprogrammer.serviciipeweb.ro/2018/03/19/tiny-types-part-2adding-iequatable/
  3. http://msprogrammer.serviciipeweb.ro/2018/03/26/tinytypesadding-equality-operatorpart-3/

  4. http://msprogrammer.serviciipeweb.ro/2018/04/02/tiny-typesdocumentationpart-4/

As always, the bigger problem is adding equality. The Tiny Type should be equal with the inner value – and with the other type with the same value. And, in C#, when you implement equality , there is a whole theory – see https://msdn.microsoft.com/en-us/library/336aedhh(v=vs.100).aspx .

So the code to define equality is 60 lines long just for defining equality for

public class TinyType<T>:IEquatable<T>, IEquatable<TinyType<T>>

   

But this is not all. This is the code for testing equality

using Microsoft.VisualStudio.TestTools.UnitTesting;
using TinyTypesObjects;

namespace TinyTypesTest
{
    [TestClass]
    public class TestTinyTypeEquals
    {
        [TestMethod]
        public void TestSimpleStringEquals()
        {
            #region arrange
            string s = "http://msprogrammer.serviciipeweb.ro";
            #endregion
            #region act
            TinyType<string> tt1 = s;
            TinyType<string> tt2 = s;
            #endregion
            #region assert
            Assert.IsTrue(tt1.Equals(tt2));
            Assert.AreEqual(tt1, tt2);
            Assert.AreEqual<string>(tt1, tt2);
            Assert.AreEqual<TinyType<string>>(tt1, tt2);
            Assert.AreEqual<string>(s, tt2);
            #endregion
        }
        [TestMethod]
        public void TestSimpleStringWithNull()
        {
            #region arrange
            string s = null;
            #endregion
            #region act
            TinyType<string> tt1 = s;
            TinyType<string> tt2 = null;
            #endregion
            #region assert
            Assert.IsFalse(tt1.Equals(tt2));
            Assert.AreNotEqual(tt1, tt2);
            Assert.AreEqual<string>(tt1, tt2);
            Assert.AreNotEqual<TinyType<string>>(tt1, tt2);
            Assert.AreEqual<string>(s, tt2);
            #endregion
        }
        [TestMethod]
        public void TestSimpleStringNull()
        {
            #region arrange
            string s = null;
            #endregion
            #region act
            TinyType<string> tt1 = s;
            TinyType<string> tt2 = s;
            #endregion
            #region assert
            Assert.IsTrue(tt1.Equals(tt2));
            Assert.AreEqual(tt1, tt2);
            Assert.AreEqual<string>(tt1, tt2);
            Assert.AreEqual<TinyType<string>>(tt1, tt2);
            Assert.AreEqual<string>(s, tt2);
            #endregion
        }
        [TestMethod]
        public void TestSimpleIntEquals()
        {
            #region arrange
            int s = 1;
            #endregion
            #region act
            TinyType<int> tt1 = s;
            TinyType<int> tt2 = s;
            #endregion
            #region assert
            Assert.IsTrue(tt1.Equals(tt2));
            Assert.AreEqual(tt1, tt2);
            Assert.AreEqual<int>(tt1, tt2);
            Assert.AreEqual<TinyType<int>>(tt1, tt2);
            Assert.AreEqual<int>(s, tt2);
            
            #endregion
        }

    }
}

Tiny types in C#–part 1

This is a series

  1. http://msprogrammer.serviciipeweb.ro/2018/03/12/tiny-types-in-cpart-1/
  2. http://msprogrammer.serviciipeweb.ro/2018/03/19/tiny-types-part-2adding-iequatable/
  3. http://msprogrammer.serviciipeweb.ro/2018/03/26/tinytypesadding-equality-operatorpart-3/

  4. http://msprogrammer.serviciipeweb.ro/2018/04/02/tiny-typesdocumentationpart-4/

I have read about tiny types in Javascript  – at https://darrenhobbs.com/2007/04/11/tiny-types/ and at https://janmolak.com/tiny-types-in-typescript-4680177f026e . It was an interesting idea – especially in this world of REST API .

I decided to make the same on C# – so here it is: https://github.com/ignatandrei/tinyTypes and at https://www.nuget.org/packages/TinyTypesObjects .

For the moment , the tests are minimal – just to get working :

using Microsoft.VisualStudio.TestTools.UnitTesting;
using TinyTypesObjects;

namespace TinyTypesTest
{
    [TestClass]
    public class TestTinyType
    {
        [TestMethod]
        public void TestConvert()
        {
            string s = "http://msprogrammer.serviciipeweb.ro";
            TinyType<string> tt = s;
            Assert.AreEqual(s, (string)tt);
        }
        [TestMethod]
        public void TestBehaviour()
        {
            #region arrange + act
            Author a1 = new Author("andrei", "ignat");
            Author a2 = new Author(
                new FirstName("andrei"),new LastName( "ignat"));

            Author a3 = new Author(firstName:"andrei",lastName: "ignat");
            #endregion
            #region assert
            Assert.AreEqual(a2.FullName(), a3.FullName());
            Assert.AreEqual(a2.FullName(), a3.FullName());
            #endregion

        }
    }
}

Next time , I will do IComparable / Iequatable /Equals and others

Making any call to a function of an object thread safe

 

 

I was wondering how to modify old code to support threads /task .

So I was making a small project about making any function of an object thread safe.

NuGet Package at : https://www.nuget.org/packages/ThreadSafeObject/

The solution contain tests and 2 console project for .NET Core and .NET Framework 4.5.1

The usage is pretty easy

Let’s say you have this

Calculation c = new Calculation();
c.Add();

And you want

c.Add

to be thread safe

In the Package Manager Console write:

Install-Package ThreadSafeObject

Then modify your code to:

Calculation c = new Calculation();
dynamic ts = new ThreadSafe(c);
ts.Add();

It is a toy project- however, it has tests to prove it is correct.

You can download the code source from https://github.com/ignatandrei/ThreadSafeObject/